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 à