Come eseguire uno script di shell da C in Linux?

Come eseguire uno script di shell da C in Linux?


Come posso eseguire uno script di shell da C in Linux?


Risposte:


Dipende da cosa vuoi fare con lo script (o qualsiasi altro programma che vuoi eseguire).


Se vuoi solo eseguire lo script system è la cosa più semplice da fare, ma fa anche altre cose, incluso l'esecuzione di una shell e l'esecuzione del comando (/bin/sh sotto la maggior parte dei *nix).


Se vuoi alimentare lo script della shell tramite il suo standard input o consumare il suo standard output puoi usare popen (e pclose ) per installare un tubo. Questo usa anche la shell (/bin/sh sotto la maggior parte dei *nix) per eseguire il comando.


Entrambe sono funzioni di libreria che fanno molto sotto il cofano, ma se non soddisfano le tue esigenze (o vuoi semplicemente sperimentare e imparare) puoi anche utilizzare direttamente le chiamate di sistema. Ciò ti consente anche di evitare che la shell (/bin/sh) esegua il comando per te.


Le chiamate di sistema di interesse sono fork , execve e waitpid . Potresti voler usare uno dei wrapper della libreria intorno a execve (digitare man 3 exec per un elenco di essi). Potresti anche voler utilizzare una delle altre funzioni di attesa (man 2 wait li ha tutti). Inoltre potresti essere interessato alle chiamate di sistema clone e vfork che sono correlati al fork.


fork duplica il programma corrente, dove l'unica differenza principale è che il nuovo processo ottiene 0 restituito dalla chiamata al fork. Il processo padre ottiene l'ID processo del nuovo processo (o un errore) restituito.


execve sostituisce il programma corrente con un nuovo programma (mantenendo lo stesso ID processo).


waitpid viene utilizzato da un processo padre per attendere il completamento di un particolare processo figlio.


Avere i passaggi fork ed execve separati consente ai programmi di eseguire alcune impostazioni per il nuovo processo prima che venga creato (senza rovinarsi). Questi includono la modifica dell'input standard, dell'output e dello stderr in file diversi rispetto al processo padre utilizzato, la modifica dell'utente o del gruppo del processo, la chiusura di file di cui il figlio non avrà bisogno, la modifica della sessione o la modifica delle variabili ambientali.


Potrebbe interessarti anche il pipe e dup2 chiamate di sistema. pipe crea una pipe (con un descrittore di file di input e di output). dup2 duplica un descrittore di file come descrittore di file specifico (dup è simile ma duplica un descrittore di file nel descrittore di file più basso disponibile).