我正在寻找一种方法,当孩子即将结束或刚刚结束时,从父母访问孩子的task_struct。我不想使用wait / waitpid的原因是因为等待完成后,task_struct和其他东西都被释放了。
有没有办法让父进程在没有调用wait的情况下等待子进程结束(所以仍然可以从僵尸进程访问task_struct)? 有什么想法可以尝试吗?
答案 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设置信号处理程序