Unix / Linux: Comment créer un Processus Zombie

Objectif: Analyser comment les processus zombies ou les processus défunts sont créés et comment les supprimer de la table des processus.

Un processus zombie ou un processus disparu est un processus qui a terminé son exécution mais qui a toujours une entrée dans la table des processus. Cela se produit pour les processus enfants qui ont été bifurqués par un processus parent utilisant l’appel système fork() mais qui n’ont pas été récoltés par le processus parent utilisant l’appel système wait().

Le processus parent doit effectuer un appel système wait() (ou waitpid()) pour obtenir le statut de sortie du processus enfant une fois le processus enfant terminé. Si l’appel wait() n’est pas effectué par le processus parent, le processus enfant deviendra un processus zombie.

Un signal SIGCHLD est envoyé au processus parent chaque fois qu’un processus enfant se termine. Le processus parent doit avoir une fonction de gestionnaire de signaux SIGCHLD définie avec un appel à wait() – cela supprimera le processus enfant de la table de processus.

Pour supprimer les processus zombies d’un système, le signal SIGCHLD peut être envoyé manuellement au parent, à l’aide de la commande kill. Si le processus parent refuse toujours de récolter le processus zombie et si le processus parent peut être tué, l’étape suivante consiste à tuer le processus parent. Lorsqu’un processus enfant perd son processus parent, init (PID 1) devient son nouveau parent. init exécute périodiquement l’appel système wait() pour récolter tous les processus zombies avec init comme parent.

J’ai écrit un programme C simple pour créer un processus zombie.

zombie.c – création d’un processus zombie

C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# inclure < stdio.d>
# inclure < stdlib.d>
# inclure < sys/types.d>
# inclure < sys/wait.d>
# inclure < unistd.d>
# inclure < errno.h>
int main ()
{
pid_t child_pid;
int child_status;
child_pid=fork();
si(child_pid > 0) {
// le processus parent se met en veille pendant 30 secondes et se ferme, sans appel à wait()
fprintf(stderr, « processus parent -%d\n », getpid());
sommeil(30);
sortie(0);
}
sinon si (child_pid == 0) {
// le processus enfant quittera immédiatement
fprintf(stderr, « processus enfant -%d\n », getpid());
sortie(0);
}
sinon si (child_pid == -1) {
// erreur fork()
perror(« échec de l’appel fork() »);
exit(-1);
}
else {
// cela ne devrait pas se produire
fprintf(stderr, « valeur de retour inconnue de %d de l’appel fork() », child_pid);
exit (-2);
}
retour 0;
}

Enregistrez le code ci-dessus sous zombie.c et compilez-le en utilisant gcc.

$ gcc zombie.c -o zombie

Ensuite, exécutez le programme.

$ ./zombie parent process - 26570child process - 26571

À partir d’un autre terminal, effectuez un ps pour afficher les processus en cours d’exécution. Vous verrez un processus zombie.

$ ps -ef | grep zombieibrahim 26570 22886 0 15:59 pts/2 00:00:00 ./zombieibrahim 26571 26570 0 15:59 pts/2 00:00:00 <defunct>

Une fois le processus parent terminé (après 30 secondes), le processus zombie sera supprimé de la table des processus par le processus init.

Mohamed Ibrahim

ibrahim = {interested_in(unix, linux, Android, open_source, reverse_engineering); codage (c, shell, php, python, java, javascript, nodejs, react); plays_on(xbox, ps4); linux_desktop_user(true); }

Write a Comment

Votre adresse e-mail ne sera pas publiée.