|
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);
...
}
|