Estou estudando o comportamento do kernel Linux há algum tempo e sempre ficou claro para mim que:
Quando um processo morre, todos os seus filhos são devolvidos ao
init
processo (PID 1) até que acabem morrendo.
No entanto, recentemente, alguém com muito mais experiência do que eu no kernel me disse que:
Quando um processo termina, todos os filhos também morrem (a menos que você use o
NOHUP
caso em que eles retornaminit
).
Agora, apesar de não acreditar nisso, ainda escrevi um programa simples para garantir isso. Eu sei que não devo confiar no time ( sleep
) para testes, pois tudo depende do agendamento do processo; no entanto, para este caso simples, acho que isso é 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;
}
Aqui está a saída do programa, com o ps
resultado associado sempre que se printf
fala:
$ ./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).
Agora, como você pode ver, isso se comporta exatamente como eu esperava. O processo órfão (436) é devolvido a init
(1) até que ele morra.
No entanto, existe algum sistema baseado em UNIX no qual esse comportamento não se aplica por padrão? Existe algum sistema no qual a morte de um processo desencadeie imediatamente a morte de todos os seus filhos?