强制父进程收获子进程<defunct>

Force the parent to reap a child process <defunct>

本文关键字:lt defunct gt 子进程 进程 收获      更新时间:2023-10-16

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

我尝试过:1.杀死-15 pid

  1. 杀伤-霰弹枪pid

  2. kill-9 pid

他们都决定将子进程写成:"defunct"(僵尸)当ps-A在linux中。

如何终止进程并强制从进程表中清除它。我必须清理它,因为它在进程表中没有记录,这就是我在代码中验证进程已终止的方式。

谢谢:-)

如果要收集子进程,必须使用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。

顺便说一句,这也允许您实际了解流程的状态,并在手册页上阅读以获取更多信息。