c++ - 在 boost 进程异步子进程中的 run() 之后是否需要 wait()?

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

我在异步模式下使用 Boost Process 来获取 stdoutstderr 和 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/

相关文章:

c++ - 如何使用此 OpenMP 关键部分避免此原始指针?

c++ - BrainBench 就业测试

c++ - boost operator << 是不明确的

c++ - 如何隐藏二进制代码中的字符串?

c++ - BlackBerry 10 Development Switch 外壳

c++ - "constant"GtkLabel 的 gtk+ 信号

c++ - boost::serialization 如何与 C++11 中的 std::shared_ptr 一起使用?

c++ - makefile 和 gtkmm 的问题

c++ - 如何从参数包中获取所有参数的类型?

c++:以整数索引作为迭代器的循环缓冲区?