【发布时间】:2015-10-18 07:24:17
【问题描述】:
简介
我正在用 C 编写一个监控程序,它执行fork() 和exec() 循环。但是我需要检查子进程是否已经终止而不阻塞主进程,即监控程序。像这样的:
主进程
pid_t child_pid = fork();
if (child_pid == 0)
exec(bar);
while (1) {
if (the child process has finished)
foo();
else
bar();
}
我的尝试
考虑到我有孩子 pid,我尝试了以下方法:
-
使用
signal 0发送kill呼叫并检查errno:if (kill(child_pid, 0) == -1 || errno == ESRCH),我认为这不是跟踪子进程状态的好方法,因为它在竞争条件下并不安全。此外,它不起作用,或者至少看起来如此。 使用
stat(2)检查proc/child_pid是否存在。在这种情况下,上述所有否定论点也是正确的,而且这种方法速度较慢。waitpid(2)。不幸的是,它阻塞了主进程。
问题
有没有其他方法可以获取此类信息?或者我已经尝试过的解决方案中遗漏了一些东西?
【问题讨论】:
-
killing achild_pid只要你还没有收获(=等待)孩子,任何信号都是完全安全的,但是用零杀死不是确定进程是否死亡的好方法。反复杀死你的僵尸孩子是完全可以接受的,直到你wait,你才会得到任何 ESRCH 错误,此时比赛条件来了。
标签: process monitoring c fork