我正在我的程序中创建一个可能创建子进程的进程(假设是进程 X) ,他们也可能这样做,我无法确定进程树何时完成(=所有后代都已退出)。
我还没有找到任何直接的 Boost 方法来做到这一点。
我的(非防弹)解决方案是维护一个受监视进程的列表,从列表中的进程 X 开始,并定期监视系统中的进程,当检测到它的父 ID 在列表中的进程时,添加进程 ID 也添加到列表中。一旦我进入一个监控周期,表明列表中的所有进程都已完成,那么进程树就完成了。
这种方法的两个主要问题是:
一个过程可能会“溜走”——考虑以下流程:
监控周期已结束,列表为 [X]。
进程 X 创建一个进程 Y,该进程创建 Z 并终止。
监控周期已经开始 - 因为它
已经完成,所以它不会检测到进程 Y,并且它不会检测到进程 Z,因为没有检测到进程 Y。
这种类型的监控非常消耗资源——因为它需要非常频繁地运行,以最大限度地减少问题 1 中描述的这些“失误”。
我的程序中使用的一些代码片段:
进程 X 创建:
m_process = ps::execute(
boost::process::initializers::set_cmd_line(...),
boost::process::initializers::bind_stdout(sink), // route stdout to a sink/pipe
boost::process::initializers::set_env(...),
boost::process::initializers::start_in_dir(...),
boost::process::initializers::throw_on_error());
进程 X 监控(简单、不足的情况):
boost::system::error_code ec;
int tmp = ps::wait_for_exit(m_process,timeout,ec);
重要笔记:
- 我无法控制子进程(进程 X),也不知道它要做什么,也不知道它会产生什么进程。
- 我的解决方案应该同时适用于 Windows 和 Linux(如果不可能,我将不得不在我的程序中使用特定于操作系统的代码,这(到目前为止)与操作系统无关)。