介绍
我正在用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,我尝试了以下方法:
使用信号0发送
kill
调用并检查errno
:if (kill(child_pid, 0) == -1 || errno == ESRCH)
,但我认为这不是跟踪子进程状态的好方法,因为它不安全,容易出现竞态条件。此外,它似乎也没有起作用。使用
stat(2)
检查proc/child_pid
是否存在。在这种情况下,所有上述负面参数都是正确的,而且这种方法更慢。waitpid(2)
。不幸的是,它会阻塞主进程。
问题
是否还有其他方法可以获取这种信息?或者,我可能从我已经尝试的解决方案中漏掉了什么?
kill
一个名为child_pid
的进程是完全安全的,只要你还没有回收(=等待)这个子进程,但使用0信号来判断一个进程是否已死亡并不是一个好方法。反复杀死僵尸进程是完全可以接受的,直到你wait
时才会出现任何ESRCH错误,此时竞争条件就出现了。 - Petr Skocik