Come si scrive un programma C per eseguire un altro programma?

In Linux, vorrei scrivere un programma in C che lanci un altro programma. Quando il programma è in esecuzione, la shell aspetterà che tu inserisca un comando che hai definito nel tuo programma. Questo comando avvierà il secondo programma.

Ad esempio, supponiamo che esista un semplice programma in C chiamato “ciao” nella stessa directory del programma di richiamo. Il programma “ciao” stampa l’output “ciao, mondo”. Il primo programma verrebbe eseguito e l’utente inserirà il comando “ciao”. Il programma “ciao” verrebbe eseguito e “ciao, mondo”. verrebbe inviato alla shell.

Ho effettuato alcune ricerche e le persone hanno suggerito le funzioni “fork ()” e “exec ()”. Altri hanno detto di usare “system ()”. Non ho conoscenza di queste funzioni. Come posso chiamare queste funzioni? Sono appropriati da usare?

Il codice di esempio con le spiegazioni sarebbe molto utile. Altre risposte sono anche benvenute. Il tuo aiuto è molto apprezzato.

#include  #include  #include  /* for fork */ #include  /* for pid_t */ #include  /* for wait */ int main() { /*Spawn a child to run the program.*/ pid_t pid=fork(); if (pid==0) { /* child process */ static char *argv[]={"echo","Foo is my name.",NULL}; execv("/bin/echo",argv); exit(127); /* only if execv fails */ } else { /* pid!=0; parent process */ waitpid(pid,0,0); /* wait for child to exit */ } return 0; } 

Se sei nuovo al fork, la rappresentazione grafica di fork ed exec potrebbe esserti utile.

Rappresentazione della fork()

  +-------------+ |main program | +-------------+ (fork()) |___________________________ +-------------+ | |main program | +-------------+ +-------------+ |main program | | +-------------+ +-------------+ | (exec()) |main program | +-------------+ +-------------+ |hello program| +-------------+ 

Come potresti aver già letto in un tutorial, dopo aver chiamato fork() viene creata una copia duplicata del programma esistente, e successivamente exec() sostituisce quella copia con il nuovo programma, che tu passi ad esso come argomenti. Due unità di esecuzione per due programmi saranno in esecuzione dopo fork() .

Il system() sarà abbastanza per te?

 /* ... */ if (!strcmp(cmd, "hello")) system("hello.exe"); /* ... */ 

Per il caso più semplice dovresti avere due programmi compilati in una directory:

 > ls . hello second 

Nel secondo programma devi solo chiamare il system("hello");

Ho fatto qualche ricerca, e le persone hanno suggerito le funzioni fork() ed exec() . Altri hanno detto di usare system() . Non ho conoscenza di queste funzioni. Come posso chiamare queste funzioni? Sono appropriati da usare?

Sì. Leggere prima la documentazione (pagina man ), ad es. Di fork (2) , exec (3) , system (3) . Molto probabilmente hai quella documentazione localmente sul tuo computer, usando man (1) . Si noti che il system usa sh (thru bash (1) o dash (1) ), perché è fork -ing, execve (2) -ing e waitpid (2) -ing la shell POSIX /bin/sh .

Penso che la fork sia difficile da capire perché in caso di successo restituisce “due volte”. Non cercherò di spiegarlo qui (avrò bisogno di molte pagine per questo). Suggerisco all’inizio di leggere il fork (chiamata di sistema) wikipage. Quindi, leggi un buon libro di programmazione di Linux, ad esempio Advanced Linux Programming (liberamente scaricabile).

Leggi anche su Virtual Address Space e proc (5) .

Si può anche leggere Sistemi operativi: tre pezzi facili per una visione più generale.