Attention à l'identification des séquences exécutées par le père et par le fils :
if (!(n = Fork ()))
{ // Fils Kill (n, SIGKILL);
::sleep (3);
|
Si c'est le père qui prend la main en premier, il commence par dormir. Il est de nouveau extrèmement improbable qu'il soit réveillé avant que le fils prenne à son tour la main.
Donc, en principe, le fils reprend la main et effectue l'instruction :
Kill (0, SIGKILL); |
Bien entendu, il n'envoie pas le signal SIGKILL au processus de pid = 0, qui n'existe même pas, mais cela ne déclenche pas une exception. Si le pid était invalide, errno prendrait la valeur EINVAL, ce qui n'est pas le cas ici. Il faut donc aller consulter le man de la fonction kill(), qui indique :
"Si pid vaut zéro, alors le signal sig est envoyé à tous les processus appartenant au même groupe que le processus appelant."
Chaque fois que le c-shell lance une commande, il crée un groupe, tous les fils issus de cette commande appartenant à ce groupe. Donc le fils se termine et envoie SIGKILL à son père, seul processus de ce groupe. Le c-shell reprend alors la main.