我编写了一个等待事件发生的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>
。
为什么它不会消失?我能做些什么让它消失?
答案 0 :(得分:3)
您必须使用其中一个wait
calls来获取有关孩子状态变化的通知。
从手册:
终止但尚未等待的孩子成为了 &#34;僵尸&#34 ;.内核维护有关的最小信息集 僵尸进程(PID,终止状态,资源使用信息) 为了让父母稍后进行等待获得 关于孩子的信息。只要没有移除僵尸 系统通过等待,它将消耗内核进程中的一个槽 表,如果此表填充,则无法创建 进一步的过程如果父进程终止,那么它的&#34; zombie&#34; 子节点(如果有的话)由init(8)采用,它自动执行 等待移除僵尸。