【发布时间】:2017-05-23 13:20:38
【问题描述】:
我想 fork 一个进程,然后在父进程中执行以下操作:
等到它自然终止或父设置的超时期限到期(类似于 Windows 中的 waitforsingalobject),之后我将使用 kill(pid) 终止进程;
获取子进程的退出码(假设自然退出)
我需要从父进程访问子进程的 std::cout。
我尝试使用 waitpid(),但是虽然这允许我访问返回代码,但我无法使用此函数实现超时。
我还查看了以下解决方案 (https://www.linuxprogrammingblog.com/code-examples/signal-waiting-sigtimedwait),它允许我实现超时,但似乎没有办法获取返回码。
我猜我的问题归结为,在 linux 中实现这一目标的正确方法是什么?
【问题讨论】:
-
您可以使用
waitpid和WNOHANG选项来轮询子进程的状态。在读取子进程的输出时循环执行此操作,直到超时(或子进程退出)。 -
此外,如果您仔细查看链接到的示例,它在子进程结束(或被杀死)后有一个
waitpid调用,让您获得退出代码。 -
waitpid的第二个参数是状态。您可以使用WEXITSTATUS宏从中获取返回码。 -
在 WNOHAND 中使用 waitpid 似乎是一种低效且丑陋的解决方案。我不确定最后一次调用waitpid的目的是什么。让我们假设子进程没有终止然后它自然退出,所以在调用 waitpid 时进程不会消失吗?还是我在这里遗漏了什么?
-
如果子进程退出,它将成为所谓的“僵尸”并在系统中徘徊(即使没有任何东西在运行),直到您调用
wait函数之一来“reap "进程的状态。我认为您需要四处搜索并阅读更多有关 POSIX 系统(如 Linux 和 macOS)中的进程如何工作的信息。简而言之,如果您只是从waitpid调用中获取状态(而不是通过NULL),那么您链接到的程序应该完全按照您想要的方式工作(关于超时)。
标签: c++ linux multithreading fork multiprocess