见下面的代码:
#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.o 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)的子进程。
My Doubt is:
- 为什么在父母去世之前孩子没有被父母杀死?
- 正常情况下,如果我们从终端(bash)运行任何进程,没有"nohup",并杀死bash,那么bash的子进程将被杀死。如何在我们的C程序中实现这个行为?
- 我认为默认的行为是父级在死前杀死它的子级,我们必须调用wait()来克服这种行为。但我错了。那么wait()的目的是什么?
我使用的是Ubuntu 14和3.13.0-52通用内核
在Linux/UNIX系统上,除非进程退出或被其他进程显式杀死,否则进程不会死亡。
wait
系统调用所做的是挂起进程,直到它的一个子进程死亡。你也可以调用waitpid
,它等待一个特定的子进程死亡。
如果一个进程有一个控制终端,并且该终端退出,那么该控制终端下的任何进程都将被操作系统杀死。你可以使用setsid
系统调用从它的控制终端分离一个进程,这样即使在用户注销后它也可以在后台运行。
在linux中,当父进程死亡时,子进程不会被杀死。
你可以为父进程写一个信号处理程序,在这个信号处理程序中你可以调用api来终止子进程。
从父进程调用Wait系统调用来挂起它,直到它的一个子进程终止。否则子进程将成为僵尸进程。