Llevo bastante tiempo estudiando el comportamiento del kernel de Linux, y siempre me ha quedado claro que:
Cuando un proceso muere, todos sus hijos son devueltos al
init
proceso (PID 1) hasta que finalmente mueren.
Sin embargo, recientemente, alguien con mucha más experiencia que yo con el núcleo me dijo que:
Cuando finaliza un proceso, todos sus elementos secundarios también mueren (a menos que use
NOHUP
en cuyo caso vuelven ainit
).
Ahora, aunque no lo creo, aún escribí un programa simple para asegurarme de ello. Sé que no debería depender del tiempo ( sleep
) para las pruebas, ya que todo depende de la programación del proceso, pero para este caso simple, creo que es bastante suficiente.
int main(void){
printf("Father process spawned (%d).\n", getpid());
sleep(5);
if(fork() == 0){
printf("Child process spawned (%d => %d).\n", getppid(), getpid());
sleep(15);
printf("Child process exiting (%d => %d).\n", getppid(), getpid());
exit(0);
}
sleep(5);
printf(stdout, "Father process exiting (%d).\n", getpid());
return EXIT_SUCCESS;
}
Aquí está la salida del programa, con el ps
resultado asociado cada vez que printf
habla:
$ ./test &
Father process spawned (435).
$ ps -ef | grep test
myuser 435 392 tty1 ./test
Child process spawned (435 => 436).
$ ps -ef | grep test
myuser 435 392 tty1 ./test
myuser 436 435 tty1 ./test
Father process exiting (435).
$ ps -ef | grep test
myuser 436 1 tty1 ./test
Child process exiting (436).
Ahora, como puede ver, esto se comporta como esperaba. El proceso huérfano (436) se devuelve a init
(1) hasta que muere.
Sin embargo, ¿hay algún sistema basado en UNIX en el que este comportamiento no se aplique por defecto? ¿Existe algún sistema en el que la muerte de un proceso desencadene inmediatamente la muerte de todos sus hijos?