GNU/Linux >> Tutoriales Linux >  >> Linux

Crear proceso zombie

Un zombi o un "proceso difunto" en Linux es un proceso que se ha completado, pero su entrada aún permanece en la tabla de procesos debido a la falta de correspondencia entre los procesos padre e hijo. Por lo general, un proceso principal controla el estado de sus procesos secundarios a través de la función wait(). Cuando el proceso hijo ha terminado, la función de espera le indica al padre que salga por completo del proceso de la memoria. Sin embargo, si el padre falla al llamar a la función de espera para cualquiera de sus hijos, el proceso hijo permanece vivo en el sistema como un proceso muerto o zombi. Estos procesos zombis pueden acumularse, en grandes cantidades, en su sistema y afectar su rendimiento.

A continuación se muestra un programa c para crear un Proceso Zombie en nuestro sistema. Guarde este archivo como 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;
}

El proceso zombie creado a través de este código se ejecutará durante 60 segundos. Puede aumentar la duración del tiempo especificando un tiempo (en segundos) en la función sleep().

Compilar este programa

gcc zombie.c

Ahora ejecuta el programa zombie:

./a.out

El comando ps ahora también mostrará este proceso inactivo, abra una nueva terminal y use el siguiente comando para verificar el proceso inactivo:

[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:

Según tengo entendido, el proceso zombi ocurre cuando el proceso principal finaliza antes de que el proceso secundario.

Esto está mal. Según man 2 wait (ver NOTAS) :

Un niño que termina, pero que no ha sido esperado, se convierte en un "zombie".

Entonces, si desea crear un proceso zombie, después del fork(2) , el proceso hijo debería exit() , y el proceso principal debería sleep() antes de salir, dándole tiempo para observar la salida de ps(1) .

Por ejemplo, puede usar el siguiente código en lugar del suyo y usar ps(1) mientras 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. Cómo matar un proceso zombie en Linux

  2. Crear un usuario de Sudo en Debian:¿proceso paso a paso?

  3. ¿Cómo matar un proceso cuyo padre es Init?

  4. Linux:Buscar y eliminar procesos zombis

  5. crear regla de iptables por proceso/servicio

Crear un temporizador en Linux

Cómo matar procesos Zombie en Linux

Cómo crear un proceso zombi ficticio en lenguaje de programación C en Debian 10

Cómo crear un proceso zombie ficticio en Ubuntu 18.04 LTS

Cómo matar procesos Zombie en Ubuntu 20.04 LTS

Cómo matar procesos Zombie en Ubuntu