在C程序Linux中父母死亡并没有杀死孩子

时间:2015-09-08 12:13:48

标签: c linux process kill orphan

请参阅以下代码:

#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)。

我怀疑是:

  1. 为什么孩子在父母去世前没有被父母杀害?
  2. 通常如果我们在没有“nohup”的情况下从终端(bash)运行任何进程,并且杀死bash,那么bash的孩子就会被杀死。如何在我们的C程序中实现此行为?
  3. 我认为默认行为是父母在死亡之前杀死了它的孩子,我们必须调用wait()来克服这种行为。但是我错了。那么wait()的目的是什么?
  4. 我正在使用Ubuntu 14和3.13.0-52通用内核。

2 个答案:

答案 0 :(得分:2)

在Linux / UNIX系统上,进程不会消失,除非它退出或被其他进程明确杀死。

wait系统调用的作用是暂停进程,直到其子进程之一死亡。您也可以调用waitpid,等待特定的子进程死亡。

如果进程具有控制终端并且终端退出,则该控制终端下的任何进程都被OS终止。您可以使用setsid系统调用将进程从其控制终端分离,以便即使在用户注销后它也可以在后台运行。

答案 1 :(得分:0)

在linux中,父进程死亡时子进程不会被终止。

您可以为父级编写信号处理程序,在该信号处理程序中,您可以调用API来终止子进程。

从父进程调用Wait系统调用以暂停它,直到其子进程终止。否则孩子将成为一个僵尸进程。