Od dłuższego czasu badam zachowanie jądra Linuksa i zawsze było dla mnie jasne, że:
Kiedy proces umiera, wszystkie jego dzieci są zwracane do
init
procesu (PID 1), aż w końcu umrą.
Jednak ostatnio ktoś z dużo większym doświadczeniem z jądrem powiedział mi, że:
Kiedy proces się kończy, wszystkie jego dzieci również umierają (chyba że użyjesz,
NOHUP
w którym przypadku wrócąinit
).
Teraz, chociaż w to nie wierzę, wciąż napisałem prosty program, aby się tego upewnić. Wiem, że nie powinienem polegać na czasie ( sleep
) na testach, ponieważ wszystko zależy od planowania procesu, ale w tym prostym przypadku myślę, że to wystarczy.
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;
}
Oto wynik programu, z powiązanym ps
wynikiem za każdym razem, gdy printf
mówi:
$ ./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).
Teraz, jak widać, zachowuje się tak, jak bym się spodziewał. Proces osierocony (436) jest zwracany do init
(1) aż do śmierci.
Czy jednak istnieje system oparty na systemie UNIX, w którym takie zachowanie nie jest domyślnie stosowane? Czy istnieje system, w którym śmierć procesu natychmiast powoduje śmierć wszystkich jego dzieci?