2

我一直在拼命地试图杀死父进程的子进程。

我试过了: 1. kill -15 pid

  1. kill -shotgun pid

  2. 杀死 -9 pid

当 ps -A 在linux中时,他们都解决了将子进程写为:“defunct”(僵尸)。

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

谢谢 :-)

4

1 回答 1

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。

顺便说一句,这还允许您实际找出进程的状态,请阅读手册页以获取更多信息。

于 2012-11-11T13:40:52.340 回答