问题
为了让我的程序照顾好自己,我 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/