c - 我如何知道在调用 waitpid() 后我的子进程实际上已被收获?

标签 c process posix

问题

为了让我的程序照顾好自己,我 fork 了一个子进程,然后使用以下命令监视它:

pid_t w = waitpid(cpid, &status, WUNTRACED | WCONTINUED);

这会阻塞我的父进程,直到子进程 A) 退出、B) 收到信号或 C) 停止。此时我希望家长代表 child 决定是否允许其“继续生活”。

A) 在子进程已经退出的情况下, waitpid() 调用应该将其作为死亡子进程来获取,但根据我的经验,情况并非如此。即使我等待子进程退出,它仍然会在父进程退出后显示在进程列表中。在调用 waitpid() 后,我如何知道 child 是否已被收获?如果它还活着,正确的杀死它的方法是什么?

B) 如果子进程收到了诸如 SIGSEGV 之类的信号并且父进程决定终止子进程,该怎么办? SIGKILL 是唯一的选择吗?通过发送 SIGTERM 我会简单地调用另一个(递归)waitpid() 吗?

C)当陷阱发生或者子进程由于某种其他原因停止执行时,我该如何杀死它呢? SIGKILL 仍然是唯一的选择吗?

回答

最好有简单源代码的答案。

谢谢!

最佳答案

A.您需要在 status 上使用 sys/wait.h 中的 W... 宏来确定进程是否退出。如果是的话,它已经被收获了。您无需做任何其他事情,事实上,将来使用 pid 来尝试“检查它是否已被回收”将是无效的,因为 pid 已被释放并且可以重新分配给不同的(新)进程.

B.当子进程收到像 SIGSEGV 这样的信号时会发生什么与父进程无关。除非捕获到信号,否则进程将终止。

C.如果 waitpid 返回的 status 为“stopped”,并且您想终止它,您可以发送一个可捕获的信号来终止它(例如 SIGTERM code>) 后跟 SIGCONT,或者您可以使用 SIGKILL

关于c - 我如何知道在调用 waitpid() 后我的子进程实际上已被收获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23662325/

相关文章:

c - 需要知道 fork 是如何工作的吗?

c - 以与 "ls -l"命令相同的方式格式化日期/时间

使用 C 检查用户输入是否为有效字符串

c++ - Windows Python C 扩展仅适用于我自己的 Python 构建(使用 VC++ 2008 Express 的 32 位构建)

java - 两台机器上运行的进程之间的通信

c# - 以用户身份运行我的程序

c - pthread_join() 的使用

c - 使用具有固定宽度整数类型变量的 printf 宽度说明符

c - 奇怪的#define 声明,无法理解它扩展的内容

c++ - 使用硬件内存保护在64位硬件上进行数组范围检查