我已经研究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的系统?是否有任何系统可以使进程的死亡立即触发所有子进程的死亡?