【问题标题】:Getting exit code of boost::process::child under boost::asio::io_service?在 boost::asio::io_service 下获取 boost::process::child 的退出代码?
【发布时间】:2020-03-28 02:22:15
【问题描述】:

以下程序:

#include <iostream>
#include <boost/process.hpp>
#include <boost/asio.hpp>

int main() {
    boost::asio::io_service ios;
    boost::process::child c("/bin/ls");
    ios.run();
    std::cout << c.exit_code() << std::endl;
}

输出383:

$ g++ test.cc
$ ./a.out
383

我希望它输出0,因为/bin/ls 成功完成。

我错过了什么?

【问题讨论】:

    标签: c++ linux boost boost-asio boost-process


    【解决方案1】:

    您需要wait 才能完成子进程。来自boost::process::child::exit_code的文档

    如果没有等待孩子,则返回值没有任何意义 或者如果它被终止了。

    所以我希望以下内容能够给出预期的结果......

    #include <iostream>
    #include <boost/process.hpp>
    
    int main ()
    {
        boost::process::child c("/bin/ls");
        c.wait();
        std::cout << c.exit_code() << std::endl;
    }
    

    【讨论】:

    • 但是在 boost::process 教程中:boost.org/doc/libs/1_71_0/doc/html/boost_process/… 它说ios.run() 将阻塞直到孩子完成。
    • 是的,但该示例使用 io_service 和 async_pipe 来捕获进程标准输出。但是,您拥有的代码并没有使用 io_service,因为ios.run() 没有任何操作需要等待,因此会立即返回。除非我误解了什么。
    • 好吧,看看这个问题:stackoverflow.com/questions/59157240/… 我观察到与 boost 过程教程中的示例相同的问题。
    • @G.M.实际上 io_service 必须作为run() 的参数传递以暗示命令已完成
    【解决方案2】:

    作为一种简单的替代方法,您可以将boost::process::on_exitstd::future&lt;int&gt; 一起使用:

    boost::asio::io_service ios;
    std::future<int> exit_code;
    boost::process::child c("/bin/ls", ios, boost::process::on_exit=exit_code);
    ios.run();
    std::cout << exit_code.get() << std::endl;
    

    只要 future 有值,对 std::future&lt;T&gt;::get 的调用就会解锁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 2016-01-07
      • 2012-11-26
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 2017-09-17
      相关资源
      最近更新 更多