代码之家  ›  专栏  ›  技术社区  ›  bisarch

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

  •  1
  • bisarch  · 技术社区  · 7 年前

    我在用 Boost Process 以异步模式获取 stdout , stderr 以及shell命令的返回代码。在下面的代码片段中,是调用 c.wait() 必修的?根据 Boost Process 1.68 documentation 根据本法规的要求,在需要的地方不需要 that 属于 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、 等等 ,我有一个 returnStatus 属于 127 而不是预期的 0 ,当我添加 c、 等等 呼叫这叫什么区别 c、 等等 制作

    1 回复  |  直到 7 年前
        1
  •  1
  •   sehe    7 年前

    run() 通常会等待异步操作完成。

    然而,你 能够 选择终止 跑()

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

    在这种情况下,建议继续使用 wait() 所以你要避开僵尸。除此之外 on_exit() handler 是一种更灵活的方法,因为它允许您在同一台计算机上多路传输多个进程 io_context / io_service 实例,并仍然尽快响应子进程完成。