请看下面的代码:
#include<stdio.h>
void main()
{
int pid = fork();
if(pid==0)
{
while(1);
}
else
{
while(1);
}
}
从终端 1 运行此代码:
转到终端 2,并检查终端 1 上的进程:
hduser@pc4:~$ ps -ft /dev/pts/1
UID PID PPID C STIME TTY TIME CMD
hduser 3824 3505 0 17:20 pts/26 00:00:00 bash
hduser 4007 3824 21 17:33 pts/26 00:00:01 ./a.out
hduser 4008 4007 22 17:33 pts/26 00:00:02 ./a.out
hduser@pc4:~$
两个a.out在这里运行。现在杀死父 4007。
hduser@pc4:~$ kill -9 4007
hduser@pc4:~$ ps -ft /dev/pts/26
UID PID PPID C STIME TTY TIME CMD
hduser 3824 3505 0 17:20 pts/26 00:00:00 bash
hduser 4008 2077 24 17:33 pts/26 00:00:29 ./a.out
hduser@pc4:~$
注意 4008 仍在运行,它现在是 2077(init --user) 的子节点。
我的疑问是:
- 为什么孩子没有在父母死前被父母杀死?
- 通常,如果我们在没有“nohup”的情况下从终端(bash)运行任何进程,并杀死 bash,那么 bash 的孩子就会被杀死。如何在我们的 C 程序中实现这种行为?
- 我认为默认行为是父母在死前杀死了它的孩子,我们必须调用 wait() 来克服这种行为。但是我错了。那么wait()的目的是什么?
我正在使用带有 3.13.0-52-generic 内核的 Ubuntu 14。