GNU/Linux >> Linux Esercitazione >  >> Linux

Crea un processo di zombi

Uno zombie o un "processo defunto" in Linux è un processo che è stato completato, ma la sua voce rimane ancora nella tabella dei processi a causa della mancanza di corrispondenza tra i processi genitore e figlio. Di solito, un processo genitore tiene sotto controllo lo stato dei suoi processi figli attraverso la funzione wait(). Quando il processo figlio è terminato, la funzione wait segnala al genitore di uscire completamente dal processo dalla memoria. Tuttavia, se il genitore non riesce a chiamare la funzione wait per nessuno dei suoi figli, il processo figlio rimane attivo nel sistema come un processo morto o zombie. Questi processi zombie potrebbero accumularsi, in gran numero, sul tuo sistema e influenzarne le prestazioni.

Di seguito è riportato un programma c per creare un processo Zombie sul nostro sistema. Salva questo file come 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;
}

Il processo zombie creato tramite questo codice verrà eseguito per 60 secondi. Puoi aumentare la durata specificando un tempo (in secondi) nella funzione sleep().

Compila questo programma

gcc zombie.c

Ora esegui il programma zombie:

./a.out

Il comando ps ora mostrerà anche questo processo defunto, aprirà un nuovo terminale e utilizzerà il comando seguente per controllare il processo defunto:

[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

Citando:

A quanto mi risulta, il processo zombie si verifica quando il processo genitore termina prima del processo figlio.

Questo è sbagliato. Secondo man 2 wait (vedi NOTE) :

Un bambino che termina, ma non è stato atteso, diventa uno "zombie".

Quindi, se vuoi creare un processo zombie, dopo fork(2) , il processo figlio dovrebbe exit() , e il processo genitore dovrebbe sleep() prima di uscire, dandoti il ​​tempo di osservare l'output di ps(1) .

Ad esempio, puoi utilizzare il codice seguente al posto del tuo e utilizzare ps(1) mentre sleep() ing:

#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. Come trovare e uccidere il processo Zombie in Linux

  2. comando Linux ln

  3. Crea un server DNS

  4. pthread_exit contro return

  5. Come uccidere il processo di zombi

Crea un timer su Linux

Come uccidere i processi Zombie in Linux

Come creare un processo zombi fittizio nel linguaggio di programmazione C su Debian 10

Come creare un processo zombi fittizio in Ubuntu 18.04 LTS

Come uccidere i processi zombie in Ubuntu 20.04 LTS

Come uccidere i processi zombi in Ubuntu