等待子进程而不释放其资源

时间:2015-06-03 23:07:14

标签: c linux-kernel fork zombie-process

我正在寻找一种方法,当孩子即将结束或刚刚结束时,从父母访问孩子的task_struct。我不想使用wait / waitpid的原因是因为等待完成后,task_struct和其他东西都被释放了。

有没有办法让父进程在没有调用wait的情况下等待子进程结束(所以仍然可以从僵尸进程访问task_struct)? 有什么想法可以尝试吗?

2 个答案:

答案 0 :(得分:2)

您可以使用waitid(2)标记来呼叫WNOWAIT。以下是该联机帮助页的摘录:

  

WNOWAIT

     

让孩子处于等待状态;以后的等待电话可以   用于再次检索子状态信息。

所以,像这样:

siginfo_t siginfo;
if (waitid(P_ALL, 0, &siginfo, WNOWAIT) < 0) {
    // Handle error...
} else {
    // PID of terminated child lives in siginfo.si_pid
}

这可确保父级阻止,直到子级终止,但它仍然会让子级僵尸在系统中停留。

如果您想等待具有pid X的特定子流程,请使用waitid(P_PID, X, &siginfo, WNOWAIT)

可以从siginfo.si_status检索孩子的退出状态。请参阅man waitid以了解siginfo中的其他字段。

答案 1 :(得分:0)

引自makelinux

  

TASK_ZOMBIE 任务已终止,但其父级尚未发布   Reported chip type: value "2307"系统调用。任务的进程描述符必须保留   父母想要访问它的情况。如果父调用wait4(),则   进程描述符被释放。

即使您的孩子已经终止直到其父母已经等待,过程描述符或您的wait4()仍会存在。所以,你可以继续访问孩子的task_struct,就像你活着时一样。但是,task_struct可能会移动到不同的内核队列。类似于终止队列而不是正在运行或就绪的队列

此外,如果您想要通知您的孩子已经死亡,并且不希望在task_struct设置waitid时阻止,则可以为SIGCHLD设置信号处理程序