#include <stdio.h>
#include <unistd.h>
int main
() {
char* argv
[] =
{ "ls",
"-l",
NULL };
int res = execvp
("ls", argv
);
perror
("errore nella exec");
printf("questa riga viene eseguita solo se "
"non e' stato possibile lanciare il programma\n");
return 1;
}
Esempio di
fork: genitore attende terminazione del figlio, con figlio che rimane zombie finché il genitore non ne recupera con
wait lo stato di terminazione.
#include <unistd.h> // fork
#include <stdio.h>
int main
() {
printf("[gen] sto per fare una fork, sono %d!\n",
getpid
());
pid_t pid = fork
();
if (pid ==
0) { // codice eseguito dal figlio
printf("[figlio] proc=%d [genitore=%d]\n", getpid
(), getppid
());
printf("[figlio] terminato\n");
_exit
(13);
}
// codice eseguito dal genitore
int status;
sleep
(40);
pid_t c = wait
(&status
);
printf("[gen] processo %d e' terminato con stato %d\n", c, status
);
printf("[gen] terminato\n");
return 0;
}
Altro esempio di
fork: genitore termina prima del figlio, che prende come nuovo genitore un altro processo antenato nell'albero dei processi.
#include <unistd.h> // fork, getpid, getppid
#include <stdio.h>
int main
() {
printf("[gen] sto per fare una fork, sono %d!\n", getpid
());
pid_t pid = fork
();
if (pid ==
0) {
printf("[figlio] proc=%d [genitore=%d]\n", getpid
(), getppid
());
sleep
(40);
printf("[figlio] terminato dopo il padre [nuovo genitore=%d]\n", getppid
());
_exit
(13);
}
printf("[gen] terminato prima del figlio\n");
return 0;
}