fork进程:子进程终止时恢复父进程(Linux)

时间:2015-11-24 11:45:33

标签: c++ linux fork

我编写了一个等待事件发生的C ++应用程序(例如,等待传入连接)。在该事件发生之后,它将继续分叉处理该事件的子进程。

所以,我的代码看起来基本上是这样的:

int main(void) {
  while(1) {
    Event e = waitUntilSomethingHappens(); // blocks execution until event occurs
    pid_t pid = fork(); 
    if (pid == 0) {
      doChildStuff(e); 
      exit(0); 
      return 0; 
    }
  }
  return 0;
}

我现在的期望是子进程将终止(因为exit(0)和/或return)。实际上,它离开了while循环,但它似乎没有被终止。当我点击ps -e时,会显示两个进程,而子进程则标记为<defunct>

为什么它不会消失?我能做些什么让它消失?

1 个答案:

答案 0 :(得分:3)

您必须使用其中一个wait calls来获取有关孩子状态变化的通知。

从手册:

  

终止但尚未等待的孩子成为了   &#34;僵尸&#34 ;.内核维护有关的最小信息集   僵尸进程(PID,终止状态,资源使用信息)   为了让父母稍后进行等待获得   关于孩子的信息。只要没有移除僵尸   系统通过等待,它将消耗内核进程中的一个槽   表,如果此表填充,则无法创建   进一步的过程如果父进程终止,那么它的&#34; zombie&#34;   子节点(如果有的话)由init(8)采用,它自动执行   等待移除僵尸。