PRATIQUE OUTILS 
Unix : se débarrasser des zombies
 
Ces coquilles de processus peuvent rendre la gestion des programmes très laborieuse. Quelques techniques pour en venir à bout. (14/02/2005)
  Forum

Réagissez dans les forums de JDN Développeurs

Un processus en cours peut générer des processus-enfants (child process) pour les besoins de ses traitements. Si le processus-enfant termine sa tâche avant le processus-parent, le système conserve les informations de l'enfant dans le cas où le parent en a encore besoin, jusqu'à ce que ce dernier le termine lui-même, via wait().

Entre la fin de son traitement effectif et le wait() du parent, le processus-enfant est donc appelé zombie : même sans être utilisé ni consommer de ressources, il est affiché dans la liste des processus. Certains systèmes étant limités dans le nombre de processus qu'ils peuvent gérer, cela peut mener à un conflit.

Dans le cas où le parent se terminerait sans terminer aussi son enfant, ce dernier est pris en charge par le système qui le termine proprement, mais il est préférable d'éviter dès que possible la formation de zombies.

Pour cela, plusieurs possibilités : on peut s'assurer que le processus-parent utilise bien wait() (ou un équivalent) pour tout processus-enfant qui termine sa tâche.
Une autre solution consiste en une réplication du processus-enfant dès qu'il est créé (un second fork(), en somme), et de fermer le premier processus-enfant dès le fork() achevé. Ainsi, le second enfant est orphelin, et est donc pris en charge par le système.
On peut enfin repérer le signal SIGCHILD, pour alors appeler waitpid() :

void tuer_childproc (int sig) {
  int status;
  while(waitpid(-1, &status, WNOHANG) > 0);
  }
int main() {
  signal(SIGCHLD, tuer_childproc);
  ...
  }

 
Xavier Borderie, JDN Développeurs
 
 
Accueil | Haut de page