0

请看下面的代码:

#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) 的子节点。

我的疑问是:

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

我正在使用带有 3.13.0-52-generic 内核的 Ubuntu 14。

4

2 回答 2

2

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

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

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

于 2015-09-08T12:19:53.120 回答
0

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

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

从父进程调用等待系统调用以将其挂起,直到其子进程之一终止。否则子进程会变成僵尸进程。

于 2015-09-08T12:18:57.793 回答