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

Fork process: Resume parent process while children terminated (Linux)

本文关键字:进程 恢复 Linux 终止 子进程 Fork      更新时间:2023-10-16

我编写了一个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>

为什么它不消失?我该怎么办才能让它消失?

您必须使用其中一个wait调用来获取子级状态更改的通知。

来自手册:

终止但尚未等待的子项将成为"僵尸"。内核维护关于僵尸进程(PID、终止状态、资源使用信息)以便允许父级稍后执行等待以获得关于孩子的信息。只要僵尸没有从系统通过等待,它将占用内核进程中的一个插槽表,如果该表已填充,则无法创建进一步处理。如果父进程终止,则其"僵尸"init(8)采用子项(如果有的话),它会自动执行等待移除僵尸。