Я уже довольно давно изучаю поведение ядра Linux, и мне всегда было ясно, что:
Когда процесс умирает, все его дочерние элементы возвращаются
init
процессу (PID 1) до тех пор, пока они в конечном итоге не умрут.
Однако недавно кто-то с большим опытом работы с ядром сказал мне, что:
Когда процесс завершается, все его дочерние элементы также умирают (если вы не используете,
NOHUP
в этом случае они возвращаютсяinit
).
Теперь, хотя я не верю в это, я все же написал простую программу, чтобы убедиться в этом. Я знаю, что не следует полагаться на time ( 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, к которой это поведение не применяется по умолчанию? Существует ли какая-либо система, в которой смерть процесса немедленно вызывает смерть всех его детей?