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); |
重要说明:
它将要做什么,或它将产生什么过程。
可能的话,我将不得不在我的操作系统中使用特定于操作系统的代码
程序(到目前为止)与OS无关。
如果您可以使用某些IPC机制(stdout,消息队列,共享内存,命名管道...)更改子进程以报告它们正在创建的PID,那么您就可以开始了。
您可以将Boost Asio与获得的句柄(
否则,您可能会绑定到调试导向的接口(需要提升的权限),例如
-
在Linux上的ptrace(请参见例如
PTRACE_EVENT_VFORK ,在此处http://man7.org/linux/man-pages/man2/ptrace.2.html) -
Windows:在Windows中等待孙子进程
我建议如果您控制子进程,那么最好使用IPC协调工作