【问题标题】:Wait for child process without freeing its resources等待子进程而不释放其资源
【发布时间】:2015-06-03 23:07:13
【问题描述】:

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

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

【问题讨论】:

  • 最好能提供更多信息以及示例代码来说明您想要实现的目标。您是如何访问struct task_struct 的?是什么阻止您使用vfork() 阻止父母直到孩子返回。

标签: c linux-kernel fork zombie-process


【解决方案1】:

您可以使用WNOWAIT 标志调用waitid(2)。这是手册页的摘录:

等待

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

所以,是这样的:

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, &amp;siginfo, WNOWAIT)

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

【讨论】:

    【解决方案2】:

    引用makelinux

    TASK_ZOMBIE 任务已终止,但其父级尚未发出 wait4() 系统调用。任务的进程描述符必须保留在 如果父母想要访问它。如果父进程调用 wait4(),则 进程描述符被释放。

    即使您的子进程已经终止,进程描述符或您的task_struct 仍将持续存在,直到其父进程等待它为止。因此,您可以继续访问孩子的task_struct,就像您在孩子还活着时所做的那样。不过,task_struct 可能会移动到不同的内核队列。类似于终止队列而不是运行或就绪队列

    此外,如果您想通知您孩子的死亡并且不想阻止设置了WNOWAITwaitid,您可以为SIGCHLD 设置信号处理程序

    【讨论】:

      猜你喜欢
      • 2018-11-08
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 2021-03-29
      • 2013-11-08
      • 2021-11-07
      • 2010-10-04
      相关资源
      最近更新 更多