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.