请参阅以下代码:
#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.outs在这里运行。现在杀死父母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)。
我怀疑是:
我正在使用Ubuntu 14和3.13.0-52通用内核。
答案 0 :(得分:2)
在Linux / UNIX系统上,进程不会消失,除非它退出或被其他进程明确杀死。
wait
系统调用的作用是暂停进程,直到其子进程之一死亡。您也可以调用waitpid
,等待特定的子进程死亡。
如果进程具有控制终端并且终端退出,则该控制终端下的任何进程都被OS终止。您可以使用setsid
系统调用将进程从其控制终端分离,以便即使在用户注销后它也可以在后台运行。
答案 1 :(得分:0)
在linux中,父进程死亡时子进程不会被终止。
您可以为父级编写信号处理程序,在该信号处理程序中,您可以调用API来终止子进程。
从父进程调用Wait系统调用以暂停它,直到其子进程终止。否则孩子将成为一个僵尸进程。