Éviter les processus zombies

Problème

Votre programme génère des processus zombies et vous souhaitez vous en débarrasser proprement.

Solution

Lors de la réception d’un signal SIGCHLD, utilisez une fonction de la famille wait() pour prendre connaissance de la fin d’exécution d’un processus fils devenu zombie.

Discussion

Lorsqu’un processus s’arrête, le système ne le fait pas disparaître mais lui donne un état, dit zombie. Il ne tourne plus, mais reste dans la table des processus. Pour le faire disparaître complètement, il faut lire son code retour avec wait(), waitpid(), wait3() ou wait4(). L’obtention de ce code retour est discutée dans la recette du chapitre suivant : "Récupérer le code de retour d’un programme qui s’est terminé".

Lorsqu’un processus s’arrête, le système envoie de plus un signal SIGCHLD au processus père. Il est possible de se servir de cela pour exécuter la balayette à zombies. Ce terme désigne le code suivant, à savoir une boucle qui appelle waitpid() tant qu’il existe des processus fils devenus zombies et les fait ainsi disparaître de la table des processus.


while (0 < waitpid (-1, NULL, WNOHANG));
 

La mise en place d’un gestionnaire de signaux est abordée dans la première recette du chapitre précédent. Le voici implémentée pour le cas qui nous intéresse :...

Pour consulter la suite, découvrez le livre suivant :
couv_EI3CACT.png
60-signet.svg
En version papier
20-ecran_lettre.svg
En version numérique
41-logo_abonnement.svg
En illimité avec l'abonnement ENI
130-boutique.svg
Sur la boutique officielle ENI
Précédent
Créer un nouveau processus
Suivant
Créer un nouveau thread