在C程序Linux中,父进程的死亡不会杀死子进程



见下面的代码:

#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:

  1. 为什么在父母去世之前孩子没有被父母杀死?
  2. 正常情况下,如果我们从终端(bash)运行任何进程,没有"nohup",并杀死bash,那么bash的子进程将被杀死。如何在我们的C程序中实现这个行为?
  3. 我认为默认的行为是父级在死前杀死它的子级,我们必须调用wait()来克服这种行为。但我错了。那么wait()的目的是什么?

我使用的是Ubuntu 14和3.13.0-52通用内核

在Linux/UNIX系统上,除非进程退出或被其他进程显式杀死,否则进程不会死亡。

wait系统调用所做的是挂起进程,直到它的一个子进程死亡。你也可以调用waitpid,它等待一个特定的子进程死亡。

如果一个进程有一个控制终端,并且该终端退出,那么该控制终端下的任何进程都将被操作系统杀死。你可以使用setsid系统调用从它的控制终端分离一个进程,这样即使在用户注销后它也可以在后台运行。

在linux中,当父进程死亡时,子进程不会被杀死。

你可以为父进程写一个信号处理程序,在这个信号处理程序中你可以调用api来终止子进程。

从父进程调用Wait系统调用来挂起它,直到它的一个子进程终止。否则子进程将成为僵尸进程。

相关内容

  • 没有找到相关文章

最新更新