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