Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fork进程:在子进程终止时恢复父进程(Linux) 我编写了一个C++应用程序,等待事件发生(例如等待传入连接)。该事件发生后,它将通过派生处理该事件的子进程来继续_C++_Linux_Fork - Fatal编程技术网

Fork进程:在子进程终止时恢复父进程(Linux) 我编写了一个C++应用程序,等待事件发生(例如等待传入连接)。该事件发生后,它将通过派生处理该事件的子进程来继续

Fork进程:在子进程终止时恢复父进程(Linux) 我编写了一个C++应用程序,等待事件发生(例如等待传入连接)。该事件发生后,它将通过派生处理该事件的子进程来继续,c++,linux,fork,C++,Linux,Fork,因此,我的代码基本上如下所示: 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

因此,我的代码基本上如下所示:

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
时,两个进程都会显示,而子进程则标记为


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

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

从手册中:

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


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

从手册中:

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


啊,我明白了。非常感谢。但现在的问题是,我必须把
等待
呼叫放在哪里?我不想用
wait
阻止父进程。它应该在子级执行时等待新事件。我可以在一个
std::vector
中收集所有PID,当它超过一定大小时,我可以等待所有PID终止。有更好的解决办法吗?或者我可以将等待任务委托给另一个孩子吗?取决于用例。但是在任何情况下,根据手册:
WNOHANG
-如果没有孩子退出,请立即返回。啊,我明白了。非常感谢。但现在的问题是,我必须把
等待
呼叫放在哪里?我不想用
wait
阻止父进程。它应该在子级执行时等待新事件。我可以在一个
std::vector
中收集所有PID,当它超过一定大小时,我可以等待所有PID终止。有更好的解决办法吗?或者我可以将等待任务委托给另一个孩子吗?取决于用例。但在任何情况下,从手册:
WNOHANG
-如果没有孩子退出,请立即返回。