Studio il comportamento del kernel Linux da un po 'di tempo ormai, ed è sempre stato chiaro per me che:
Quando un processo muore, tutti i suoi figli vengono restituiti al
init
processo (PID 1) fino a quando non muoiono.
Tuttavia, recentemente, qualcuno con molta più esperienza di me con il kernel mi ha detto che:
Quando un processo termina, anche tutti i suoi figli muoiono (a meno che tu non usi
NOHUP
nel qual caso tornanoinit
).
Ora, anche se non ci credo, ho comunque scritto un semplice programma per assicurarmene. So che non dovrei fare affidamento sul tempo ( sleep
) per i test poiché tutto dipende dalla pianificazione del processo, ma per questo semplice caso, penso che sia abbastanza.
int main(void){
printf("Father process spawned (%d).\n", getpid());
sleep(5);
if(fork() == 0){
printf("Child process spawned (%d => %d).\n", getppid(), getpid());
sleep(15);
printf("Child process exiting (%d => %d).\n", getppid(), getpid());
exit(0);
}
sleep(5);
printf(stdout, "Father process exiting (%d).\n", getpid());
return EXIT_SUCCESS;
}
Ecco l'output del programma, con l'Associated ps
risultato ogni volta che printf
parla:
$ ./test &
Father process spawned (435).
$ ps -ef | grep test
myuser 435 392 tty1 ./test
Child process spawned (435 => 436).
$ ps -ef | grep test
myuser 435 392 tty1 ./test
myuser 436 435 tty1 ./test
Father process exiting (435).
$ ps -ef | grep test
myuser 436 1 tty1 ./test
Child process exiting (436).
Ora, come puoi vedere, questo si comporta come mi sarei aspettato. Il processo orfano (436) viene restituito a init
(1) fino alla sua morte.
Tuttavia, esiste un sistema basato su UNIX su cui questo comportamento non si applica per impostazione predefinita? Esiste un sistema su cui la morte di un processo innesca immediatamente la morte di tutti i suoi figli?