强制父进程收获子进程<defunct>
Force the parent to reap a child process <defunct>
我一直在拼命地试图从父进程中杀死一个子进程。
我尝试过:1.杀死-15 pid
-
杀伤-霰弹枪pid
-
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。
顺便说一句,这也允许您实际了解流程的状态,并在手册页上阅读以获取更多信息。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 如何显式调用运算符<<
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 左角支架解释为操作员&lt;而不是模板参数
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- 超载操作员&lt;&lt; - 必须是二进制操作员
- 没有匹配的“运营商&lt;&lt;”