Я вивчаю поведінку ядра Linux вже досить давно, і мені завжди було зрозуміло, що:
Коли процес вмирає, всі його діти повертаються до
init
процесу (PID 1), поки вони зрештою не загинуть.
Однак нещодавно хтось із набагато більшим досвідом, ніж я, з ядром, сказав мені:
Коли процес закінчується, всі його діти також вмирають (якщо ви не використовуєте
NOHUP
в такому випадку вони повертаютьсяinit
).
Тепер, хоча я не вірю в це, я все-таки написав просту програму, щоб переконатися в цьому. Я знаю, що не слід покладатися на час ( sleep
) для тестів, оскільки все залежить від планування процесу, але для цього простого випадку я думаю, що це досить.
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;
}
Ось результат програми з відповідним ps
результатом щоразу, коли printf
йдеться:
$ ./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).
Зараз, як бачите, це поводиться так, як я б очікував. Сиротичний процес (436) повертається до init
(1), поки він не вмирає.
Однак чи існує система на основі UNIX, до якої ця поведінка не застосовується за замовчуванням? Чи існує якась система, за якою загибель процесу негайно спричиняє смерть усіх її дітей?