我在异步模式下使用 Boost Process
来获取 stdout
、stderr
和 shell 命令的返回代码。在下面的代码片段中,是否需要调用 c.wait()
?根据 Boost Process 1.68
documentation根据that,不需要它的地方boost 进程 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()
的调用时,我得到 returnStatus
127
而不是预期的 0
,这是我在添加 c.wait()
调用时得到的。调用 c.wait()
有什么区别?
最佳答案
是的,run()
通常等待异步操作完成。
但是,您可以使用 run()
的替代终止方式
- 当处理程序发出异常时
- 当另一个线程调用
stop()
- 当异步信号改变程序流程时
在这种情况下,建议仍然使用 wait()
以避免僵尸。除此之外,on_exit()
handler是更灵活的方法,因为它允许您在同一个 io_context
/io_service
实例上多路复用多个进程,并且仍然尽快响应子进程完成。
关于c++ - 在 boost 进程异步子进程中的 run() 之后是否需要 wait()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52588995/