Un zombie ou un "processus défunt" sous Linux est un processus qui a été terminé, mais son entrée reste toujours dans la table des processus en raison du manque de correspondance entre les processus parent et enfant. Habituellement, un processus parent contrôle l'état de ses processus enfants via la fonction wait (). Lorsque le processus enfant est terminé, la fonction d'attente signale au parent de quitter complètement le processus de la mémoire. Cependant, si le parent ne parvient pas à appeler la fonction d'attente pour l'un de ses enfants, le processus enfant reste actif dans le système en tant que processus mort ou zombie. Ces processus zombies peuvent s'accumuler en grand nombre sur votre système et affecter ses performances.
Vous trouverez ci-dessous un programme en c pour créer un processus Zombie sur notre système. Enregistrez ce fichier sous zombie.c :
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main ()
{
pid_t child_pid;
child_pid = fork ();
if (child_pid > 0) {
sleep (60);
}
else {
exit (0);
}
return 0;
}
Le processus zombie créé via ce code s'exécutera pendant 60 secondes. Vous pouvez augmenter la durée en spécifiant un temps (en secondes) dans la fonction sleep().
Compiler ce programme
gcc zombie.c
Lancez maintenant le programme zombie :
./a.out
La commande ps affichera désormais également ce processus obsolète, ouvrira un nouveau terminal et utilisera la commande ci-dessous pour vérifier le processus obsolète :
[email protected]:~/process$ ps -ef | grep a.out
aamir 10171 3052 0 17:12 pts/0 00:00:00 ./a.out
aamir 10172 10171 0 17:12 pts/0 00:00:00 [a.out] <defunct> #Zombie process
aamir 10177 3096 0 17:12 pts/2 00:00:00 grep --color=auto a.out
Citation :
À ma connaissance, le processus zombie se produit lorsque le processus parent se termine avant le processus enfants.
C'est faux. Selon man 2 wait
(voir REMARQUES) :
Un enfant qui se termine, mais qui n'a pas été attendu devient un "zombie".
Donc, si vous voulez créer un processus zombie, après le fork(2)
, le processus enfant doit exit()
, et le processus parent doit sleep()
avant de quitter, vous donnant le temps d'observer la sortie de ps(1)
.
Par exemple, vous pouvez utiliser le code ci-dessous au lieu du vôtre et utiliser ps(1)
tandis que sleep()
en cours :
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid;
int status;
if ((pid = fork()) < 0) {
perror("fork");
exit(1);
}
/* Child */
if (pid == 0)
exit(0);
/* Parent
* Gives you time to observe the zombie using ps(1) ... */
sleep(100);
/* ... and after that, parent wait(2)s its child's
* exit status, and prints a relevant message. */
pid = wait(&status);
if (WIFEXITED(status))
fprintf(stderr, "\n\t[%d]\tProcess %d exited with status %d.\n",
(int) getpid(), pid, WEXITSTATUS(status));
return 0;
}