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
-如果没有孩子退出,请立即返回。