我正在我的程序中创建一个流程(让我们说流程X)可能创建子流程,而可能也会这样做,而我正在无法确定进程树何时完成(=所有后代已退出)。
我没有找到任何直接的Boost方法。
我的(非防弹)解决方案是维护受监控进程的列表,从列表中的进程X开始,并定期监视系统中的进程,并在检测到进程时它的父ID在列表中,也将该进程ID添加到列表中。一旦我到达一个监视周期,指示列表中的所有进程都已完成,那么进程树已经完成。
此方法的两个主要问题是:
流程可能会“滑倒” - 请考虑以下流程:
监控周期已完成,列表为[X]。
进程X创建一个进程Y,它创建Z并终止。
监控周期已经开始 - 因为它不会检测到过程Y. 已完成,因为过程Y是,它不会检测到过程Z. 未被发现。
这种类型的监控非常耗费资源 - 因为它需要经常运行才能最大限度地减少问题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);
重要说明:
答案 0 :(得分:1)
如果您可以改变子进程以使用某种IPC机制(stdout,消息队列,共享内存,命名管道......)来报告它们正在创建的PID,那么您就有了一个开始。
您可以将Boost Asio与获得的句柄(object_handle
)一起使用。
否则,您可能会遇到调试导向的接口(需要提升的权限),例如
ptrace(参见PTRACE_EVENT_VFORK
此处http://man7.org/linux/man-pages/man2/ptrace.2.html)
我建议如果您控制子流程,那么使用IPC协调工作会更好