Additions:
if (pid == 0) { // codice eseguito dal figlio
// codice eseguito dal genitore
Additions:
printf("[figlio] proc=%d [genitore=%d]\n", getpid(), getppid());
printf("[figlio] terminato\n");
printf("[gen] processo %d e' terminato con stato %d\n", c, status);
printf("[figlio] proc=%d [genitore=%d]\n", getpid(), getppid());
Deletions:
printf("[figlio] proc=%d [genitore=%d]\n",
getpid(), getppid());
printf("[figlio] terminato [genitore=%d]\n", getppid());
printf("[gen] processo %d e' terminato "
"con stato %d\n",
c, status);
printf("[figlio] proc=%d [genitore=%d]\n",
getpid(), getppid());
Additions:
Altro esempio di ##fork##: genitore termina prima del figlio, che prende come nuovo genitore un altro processo antenato nell'albero dei processi.
Deletions:
Esempio di ##fork##: genitore termina prima del figlio, che prende come nuovo genitore un altro processo antenato nell'albero dei processi.
Additions:
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.
%%(c;myfork.c)
#include // fork
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());
printf("[figlio] terminato [genitore=%d]\n", getppid());
_exit(13);
}
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;
Esempio di ##fork##: genitore termina prima del figlio, che prende come nuovo genitore un altro processo antenato nell'albero dei processi.
%%(c;myfork2.c)
#include // fork, getpid, getppid
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;