【问题标题】:How to check if a forked process is still running from the c program如何从 c 程序检查分叉的进程是否仍在运行
【发布时间】:2014-12-10 11:52:02
【问题描述】:

我有一个分叉进程的 pid。现在,从我的 c 代码(在 Linux 上运行),我必须定期检查该进程是否仍在运行或终止。我不想使用像wait()waitpid() 这样的阻塞调用。需要(最好)一个非阻塞系统调用,它只检查这个 pid 是否仍在运行并返回子进程的状态。

什么是最好和最简单的方法?

【问题讨论】:

标签: c linux system-calls


【解决方案1】:

waitpid() 函数可以将选项值WNOHANG 设为不阻塞。一如既往地见the manual page

也就是说,我不确定 pid 是否保证不会被系统回收,这会导致竞争条件。

【讨论】:

  • waitpid 仅适用于调用它的进程的子进程。并且它们的 pid 在等待之前不会被回收,因此这是检查您的子进程是否已终止的正确方法。
  • 之前没有存储子 pid,此解决方案仅返回终止的子 pid。要获得运行孩子的 pid,我该怎么办?示例代码链接paste.ubuntu.com/25386744
【解决方案2】:
kill(pid, 0);

如果 PID 存在,这将“成功”(返回 0)。当然,它可能存在,因为原始过程结束并且新的东西取而代之......这是否重要由您决定。

您可以考虑为SIGCHLD 注册一个处理程序。这将不取决于可以回收的 PID。

【讨论】:

  • 如果进程死亡/退出并且某些其他进程以相同的 pid 启动,这也会成功。这是一种非常糟糕的做法,不应鼓励。
  • @Art:我在回答中明确承认了这一点,并提供了一个更好的解决方案,并再次明确提到它可以如何变得更好。说我“鼓励”了这种不雅的方式有点过分,你不觉得吗?
  • 注:如果您以这种方式测试的是您自己的子进程,这是安全的,因为子进程在等待之前不会回收 pid,但这仍然是一种不好的做法,因为它存在更好的系统调用,最终有人将错误地使用此方法并得到错误的结果。几乎所有 pid 的使用(除了对 waitpid 的调用)都对潜在的危险竞争条件开放。
【解决方案3】:

waitpid() 中使用WNOHANG 选项。

【讨论】:

    猜你喜欢
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多