On Wed, 16 May 2001, Ryser Francois wrote:

> qui peut m'expliquer ce ques sont les process zombi sur un systeme UNIX

Quand un processus UNIX meurt, son résultat (le status, 0 quand tout va
bien, une valeur quand quelque chose n'a pas fonctionné dans son
exécution) est maintenu dans la table des processus, occupant une entrée
entière jusqu'à ce qu'il est lu.

   schaefer@defian:~% date -s truc
   date: invalid date `truc'
   schaefer@defian:~% echo $?
   1

ici le status est lu par le shell une fois que le fils a quitté. Ben ça
tombe bien, introduisons les notions de fils et pères:

   schaefer@defian:~% pstree
   init-+-apache---8*[apache]
     |-apmd
     |-atd
     |-cardmgr
     |-cron
     |-2*[getty]
     |-inetd
     |-9*[kdeinit]
     |-kdeinit-+-karm
     |         |-kdeinit---xapm.real
     |         |-2*[kdeinit]
     |         |-xmms---xmms---2*[xmms]
     |         `-4*[xterm---ssh]
     |-kdeinit-+-xterm---bash---dnetc
     |         |-xterm---bash---pine
     |         `-xterm---bash---pstree

Sous UNIX, on crée un processus fils, copie exacte pas seulement clone
génétique du père, avec l'appel système fork(2). Si le père meurt avant le
fils, le fils est appelé `orphean' (orphelin).

   On crée un orphelin, programmatiquement, par un double fork()

         fork() -> père qui reste
                   fils qui fork() -> ce fils _exit(0)
                                      son fils continue et est orphelin
   Avantage: le père n'a pas à se préoccuper de lire le status.

Le status d'un orphelin est lu par init, père de tous les processus,
mêmes orphelins. Le status d'un fils qui a encore son père *doit* être lu.
Sinon ça fait un zombie.

   Le père doit lire le status du fils, avec p.ex. la fonction waitpid()
   ou wait() (cette dernière est bloquante).

   Dans le cas d'un père qui a son boulot à faire, on peut utiliser un
   signal-handler qui est appelé à la mort d'un fils (SIGCHLD):

   static void child_signal_handler(int value) {
      pid_t pid = wait(&message.status);

   }

   On l'initialise avec signal(2) ou sigaction(3).

   La fonction ci-dessus devrait plutôt boucler tant qu'il n'y a plus de
   fils (waitpid()), car les signaux ne s'empilent pas.

Donc, pour supprimer les zombies:

   - corriger le père

   - ou tuer le père, pour que init adopte le fils.



--
http://www-internal.alphanet.ch/linux-leman/ avant de poser
une question. Ouais, pour se désabonner aussi.

Répondre à