关于C#:Monitor后代使用Boost处理创建

Monitor descendant processes creation using Boost

我正在我的程序中创建一个可能创建子进程的进程(比如说进程X),它们也可能会创建子进程,而我在确定进程树何时完成(=所有后代都退出了)时遇到了麻烦)。

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

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

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

  • 进程可能会"滑出"-请考虑以下流程:

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

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

    • 监视周期已开始-自此以来,它不会检测到进程Y
      已经完成,并且不会检测到进程Z,因为进程Y是
      未检测到。

  • 这种类型的监视非常耗资源-因为它需要非常频繁地运行才能最小化问题1中描述的这些"滑移"。

  • 我的程序中使用了一些代码段:

    过程X的创建:

    1
    2
    3
    4
    5
    6
    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监视(简单,不足的情况):

    1
    2
    boost::system::error_code ec;
    int tmp = ps::wait_for_exit(m_process,timeout,ec);

    重要说明:

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

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

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

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

    • 在Linux上的ptrace(请参见例如PTRACE_EVENT_VFORK,在此处http://man7.org/linux/man-pages/man2/ptrace.2.html)

    • Windows:在Windows中等待孙子进程

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