J'étudie le comportement du noyau Linux depuis un certain temps déjà, et il m'est toujours apparu que:
Lorsqu'un processus meurt, tous ses enfants sont rendus au
init
processus (PID 1) jusqu'à leur mort.
Cependant, récemment, quelqu'un avec beaucoup plus d'expérience que moi avec le noyau m'a dit que:
Lorsqu'un processus se termine, tous ses enfants meurent également (à moins que vous ne l'utilisiez,
NOHUP
auquel cas ils sont renvoyésinit
).
Maintenant, même si je n'y crois pas, j'ai quand même écrit un programme simple pour m'en assurer. Je sais que je ne devrais pas compter sur time ( sleep
) pour les tests car tout dépend de la planification du processus. Pourtant, pour ce cas simple, je pense que cela suffit assez.
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;
}
Voici la sortie du programme, avec le ps
résultat associé à chaque fois printf
:
$ ./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).
Maintenant, comme vous pouvez le constater, cela se comporte exactement comme je l'aurais prévu. Le processus orphelin (436) est rendu à init
(1) jusqu'à sa mort.
Cependant, existe-t-il un système UNIX sur lequel ce comportement ne s'applique pas par défaut? Existe-t-il un système sur lequel la mort d'un processus déclenche immédiatement la mort de tous ses enfants?