1

我正在我的程序中创建一个可能创建子进程的进程(假设是进程 X) ,他们也可能这样做,我无法确定进程树何时完成(=所有后代都已退出)。

我还没有找到任何直接的 Boost 方法来做到这一点。

我的(非防弹)解决方案是维护一个受监视进程的列表,从列表中的进程 X 开始,并定期监视系统中的进程,当检测到它的父 ID 在列表中的进程时,添加进程 ID 也添加到列表中。一旦我进入一个监控周期,表明列表中的所有进程都已完成,那么进程树就完成了。

这种方法的两个主要问题是:

  1. 一个过程可能会“溜走”——考虑以下流程:

    • 监控周期已结束,列表为 [X]。

    • 进程 X 创建一个进程 Y,该进程创建 Z 并终止。

    • 监控周期已经开始 - 因为它
      已经完成,所以它不会检测到进程 Y,并且它不会检测到进程 Z,因为没有检测到进程 Y。

  2. 这种类型的监控非常消耗资源——因为它需要非常频繁地运行,以最大限度地减少问题 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);

重要笔记:

  1. 我无法控制子进程(进程 X),也不知道它要做什么,也不知道它会产生什么进程。
  2. 我的解决方案应该同时适用于 Windows 和 Linux(如果不可能,我将不得不在我的程序中使用特定于操作系统的代码,这(到目前为止)与操作系统无关)。
4

1 回答 1

1

如果您可以更改子进程以使用某种 IPC 机制(标准输出、消息队列、共享内存、命名管道...)报告他们正在创建的 PID,那么您就有了一个开始。

您可以将 Boost Asio 与获得的句柄一起使用 ( object_handle)。

否则,您可能会绑定到面向调试的接口(需要提升的权限),例如

我建议如果你控制子进程,你最好使用 IPC 协调工作

于 2015-01-20T14:39:26.170 回答