在Boost进程异步子进程中,run()之后是否需要wait()?

时间:2018-10-01 10:18:08

标签: c++ c++11 boost boost-process

我正在异步模式下使用Boost Process来获取stdoutstderr并返回shell命令的代码。在下面的代码段中,是否需要调用c.wait()?根据{{​​1}} documentation,在Boost Process 1.68的{​​{3}}中并不需要。

boost process 1.65.1

现在,我正在使用std::string command = "ls"; boost::asio::io_service ios; std::future<std::string> dataOut; std::future<std::string> dataErr; bp::child c(command, bp::std_in.close(), bp::std_out > dataOut, bp::std_err > dataErr, ios); ios.run(); c.wait(); stdOut = dataOut.get(); stdErr = dataErr.get(); returnStatus = c.exit_code(); ,当我删除对Boost 1.68的呼叫时,我得到c.wait()的{​​{1}}而不是预期的returnStatus,当我添加127调用时得到的。通话0有什么不同?

1 个答案:

答案 0 :(得分:0)

是的,run()通常等待异步操作完成。

但是,您可以使用run()的另一种终止方式

  • 从处理程序发出异常时
  • 当另一个线程调用stop()
  • 当异步信号改变程序流程时

在这种情况下,建议仍然使用wait(),以避免僵尸。除此之外,on_exit() handler是更灵活的方法,它允许您在同一个io_context / io_service实例上多路复用多个进程,并且仍会尽快响应子进程的完成尽可能。