3

Boost Process在异步模式下使用来获取 shell 命令的stdoutstderr返回代码。在下面的代码片段中,是否c.wait()需要调用?根据Boost Process 1.68 文档,它不是必需的,根据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(),我得到一个returnStatusof而不是我添加调用时得到127的期望的。通话有什么不同?0c.wait()c.wait()

4

1 回答 1

1

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

但是,您可以选择终止run()

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

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

于 2018-10-01T11:28:52.990 回答