Zombie no está realmente relacionado con los demás; simplemente es un proceso que ha finalizado, pero su proceso padre aún no ha leído su estado de salida con waitpid()
o similar. No debería verlos a menos que un proceso tenga errores o esté detenido.
Un daemon es un programa que se ejecuta sin un terminal de control. Por lo general, cuando ejecuta el programa, éste fork()s
mismo, y el padre sale, por lo que el shell cree que el comando ha finalizado, y el proceso hijo se desconecta del terminal y escapa de la sesión de inicio de sesión. Desde que salió su proceso padre, su ID de proceso padre se convierte en 1, que tradicionalmente es el init
programa, o en estos días systemd
,. Este proceso se asegura de cosechar a sus hijos cuando mueren para que no termines invadido por zombis.
Un proceso puede asociarse con un terminal de control , que es de donde normalmente obtiene su entrada y envía su salida. El terminal también puede enviar señales a procesos adjuntos e identifica un grupo de procesos como el grupo de primer plano . Los procesos que están en el grupo de primer plano pueden leer la entrada desde el terminal y se envían señales SIGINT y SIGSUSP cuando presiona Ctrl-C y Ctrl-Z. Cualquier proceso que no esté en el grupo de primer plano que intente leer desde el terminal se suspende con SIGTSTP.
El shell crea diferentes grupos de procesos para cada uno de los comandos de canalización que le pide que ejecute, y cambia cuál es el grupo de primer plano para mover los trabajos entre el primer plano y el fondo. Cuando ejecuta un comando, normalmente el shell crea un nuevo grupo de procesos y lo convierte en el grupo de primer plano . Si lo sufijas con un, &
entonces el shell simplemente deja el grupo de primer plano donde estaba y, por lo tanto, el nuevo grupo está en segundo plano. Al presionar Ctrl-Z se envía SIGSUSP al grupo de primer plano, lo que hace que la mayoría de los comandos se suspendan, pero en lugar de suspender, el shell vuelve a cambiar el grupo de primer plano activo para que pueda solicitar un nuevo comando.
El bg
comando envía SIGCONT a un grupo de procesos para que pueda reanudar la ejecución en segundo plano después de haber sido suspendido con SIGSUSP. fg
cambia el grupo de primer plano a uno de los grupos existentes que ya se están ejecutando en segundo plano, llevándolo al primer plano.
fork()
desactivar una copia de usted mismo, usarexec()
en esa copia para reemplazarlo con lo que desea ejecutar y usarwait()
en la instancia original del programa (no la copia que se ejecutóexec()
). En el muy, muy corto período de tiempo entre el momento en que el niño sale y el momento enwait()
que cosecha ese estado de salida (eliminándolo de la tabla de proceso y devolviéndolo a la persona que llama), tiene un zombie.