Es un proceso que ha completado su ejecución pero aún tiene una entrada en la tabla de procesos, permitiendo al proceso que le ha creado leer el estado de su salida. Metafóricamente, el proceso hijo ha muerto pero su “alma” (el valor de retorno de la operación) aún no ha sido recogida.


Complicado de entender cierto? con este ejemplo entenderan mejor.

Línea 8: hace un fork(), el proceso actual (padre) genera un nuevo proceso (hijo) ambos son “idénticos”

Línea 11: esta sólo será ejecutada por el proceso hijo y casualidades de la vida, es un exit(0) así que el proceso hijo acaba de morir.

Pero el proceso padre sigue, línea 13 y se suspende durante 2 minutos, desentendiéndose del hijo que acaba de morir, de hecho el padre podría intentar recoger el resultado devuelto por el hijo (un 0) pero no lo hace.

El proceso hijo, está “muerto” el resultado 0 que aún está disponible para el padre si éste lo quiere, aún no ha sido recibida por nadie así que el proceso hijo no ha terminado de morir “del todo”. Está en modo zombie.

- Ahora guarda el código anterior con el nombre de prueba.c y compila así: gcc -o prueba prueba.c y lo ejecutamos de la siguiente forma:

$ ./prueba

y veras algo como lo siguiente.

Código HTML:
$ ps auxww| grep prueba
    jonathan   12851   0.0  0.0    1624    296 pts/1     S+    14:58   0:00 ./prueba
    jonathan   12852   0.0  0.0    0           0 pts/1          Z+    14:58   0:00 [prueba] <defunct>
    jonathan   12862   0.0  0.0    3236   792 pts/2     R+   14:58   0:00 grep prueba
La (Z) es indicador de modo zombie en el proceso. El padre (PID=12851) está durmiendo (S).