2012-11-11 19 views
2

我一直在拼命地试图从父进程中杀死子进程。强制父母收获一个子进程<defunct>

我已经试过: 1.杀-15 PID

  1. 杀-shotgun PID

  2. 杀-9 PID

它们全部位于儿童解决进程编写为: “defunct”(僵尸)时ps -A在linux中。

如何杀死进程并强制将其从进程表中清除。我必须清理它,因为它在进程表中缺少记录是我如何在代码中验证进程已经死亡。

感谢:-)

+0

父进程是你的吗?你可以立即用双叉和双腿执行孩子的孤儿...... –

+0

等一下,''-shotgun''? –

+0

@ jonas是啊,我在这里看到它... ik ik –

回答

6

如果你想收集子进程,你要问使用waitpid其退出代码。从手册页:

终止,但没有被等待的孩子成为“僵尸”。内核维护一组关于僵尸进程(PID,终止状态,资源使用信息)的信息,以便父​​母稍后可以执行等待以获取关于该孩子的信息。只要僵尸不会通过等待从系统中移除,它将占用内核进程表中的一个插槽,并且如果填充该表,则将不可能创建进一步的进程。

用法有点像:

#include <sys/types.h> 
#include <sys/wait.h> 

... 
waitpid(child_pid, 0, 0); 

如果你想立即返回,即使孩子还没有退出:

waitpid(child_pid, 0, WNOHANG); 

如果你只是想收集所有的僵尸儿童,但没有找到关于特定孩子的信息,你可以:

waitpid(-1, 0, WNOHANG); 

您可以循环执行此操作,直到waitpid返回负数(即,错误),errno表示ECHILD。

顺便说一下,这也可以让您真正了解进程的状态,请阅读联机帮助页以获取更多信息。

+0

感谢乔纳斯我会立即:-) –

+0

如果我得到它的权利,父母,通过调用waitpid,将阻止并等待,直到子进程已经死亡? –

+1

是的,除非你使用WNOHANG。 – Wyzard