GNU/Linux >> Tutoriels Linux >  >> Linux

Créer un processus zombie

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

Linux
  1. Créer un utilisateur Sudo sur Debian - Processus étape par étape ?

  2. Descendants de processus ?

  3. Commande Linux ln

  4. créer une règle iptables par processus/service

  5. Comment tuer le processus zombie

Créer une minuterie sous Linux

Comment tuer les processus Zombie sous Linux

Comment créer un processus zombie factice en langage de programmation C sur Debian 10

Comment créer un processus zombie factice dans Ubuntu 18.04 LTS

Comment tuer les processus zombies dans Ubuntu 20.04 LTS

Comment tuer les processus zombies dans Ubuntu