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?
nohup
avecdisown
.disown
est un élément intégré dans un shell qui supprime un travail en cours de la table des jobs (en prenant un argument comme%1
), et l’effet secondaire utile de cela est que le shell n’envoie pas de SIGHUP au sous-processus.nohup
est un utilitaire externe qui ignore SIGHUP (et fait peu d’autres choses) puis lance la commande transmise sur sa ligne de commande.nohup
ignore en fait le signal avant queexec
la commande ne soit passée .Ceci est correct si le processus est un chef de session. Lorsqu'un responsable de session décède, un SIGHUP est envoyé à tous les membres de cette session. En pratique, cela signifie ses enfants et leurs descendants.
Un processus se fait chef de session en appelant
setsid
. Les coquilles utilisent cela.la source
fork
, kill processus processus,setsid
) et ajouté un autre enfant à cette nouvelle session. Cependant, lorsque le processus parent (nouveau responsable de session) est décédé, l'enfant n'a reçu aucun SIGHUP et s'est attaché jusqu'àinit
ce qu'il se termine.setpgid(2)
page de manuel: Si une session a un terminal de contrôle et que l'indicateur CLOCAL pour ce terminal n'est pas défini et qu'un blocage de terminal se produit, le leader de la session reçoit alors un SIGHUP. Si le responsable de la session quitte la session, un signal SIGHUP est également envoyé à chaque processus du groupe de processus au premier plan du terminal de contrôle.Donc, ce qui est dit sur les affiches, c'est que les enfants ne meurent pas, le parent les tue (ou leur envoie un signal sur lequel ils se terminent). Ainsi, vous pouvez obtenir ce que vous demandez, si vous programmez le parent pour (1) conserver un enregistrement de tous ses enfants et (2) envoyer un signal à tous ses enfants.
C’est ce que fait le shell et votre processus parent devrait le faire. Il peut être nécessaire d’attraper le signal HUP dans le parent afin de garder le contrôle nécessaire pour tuer les enfants.
la source
Il me manque un élément dans les réponses qui est légèrement lié aux parents mourants: lorsqu'un processus écrit sur un tuyau pour lequel il n'y a plus de processus de lecture, il obtient un SIGPIPE. L'action standard pour SIGPIPE est la résiliation.
Cela peut en effet provoquer la mort des processus. En fait, il s’agit de la façon habituelle de
yes
mourir du programme .Si j'exécute
sur mon système, la réponse est
et 141 est en effet 128 + SIGPIPE:
de
man 7 signal
.la source