使用Boost监视后代进程创建

时间:2015-01-20 14:06:33

标签: c++ boost boost-process

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

我没有找到任何直接的Boost方法。

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

此方法的两个主要问题是:

  1. 流程可能会“滑倒” - 请考虑以下流程:

    • 监控周期已完成,列表为[X]。

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

    • 监控周期已经开始 - 因为它不会检测到过程Y. 已完成,因为过程Y是,它不会检测到过程Z. 未被发现。

  2. 这种类型的监控非常耗费资源 - 因为它需要经常运行才能最大限度地减少问题1中描述的“滑动”。

  3. 我的程序中使用的一些代码段:

    创建流程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(如果没有 可能,我不得不求助于我的操作系统特定代码 程序,(直到现在)与OS无关)。

1 个答案:

答案 0 :(得分:1)

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

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

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

我建议如果您控制子流程,那么使用IPC协调工作会更好