boost :: process异步IO示例不起作用?

时间:2019-12-03 12:33:14

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

以下程序:

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

namespace bp = boost::process;

int main() {
    boost::asio::io_service ios;
    std::vector<char> buf(4096);

    bp::async_pipe ap(ios);

    bp::child c("/bin/ls", bp::std_out > ap);

    boost::asio::async_read(ap, boost::asio::buffer(buf),
            [](const boost::system::error_code &ec, std::size_t size){});

    ios.run();
    int result = c.exit_code();
    std::cout << result << std::endl;
}

输出383。我希望它能输出0

这几乎是该示例的复制粘贴:

https://www.boost.org/doc/libs/1_71_0/doc/html/boost_process/tutorial.html#boost_process.tutorial.async_io

1 个答案:

答案 0 :(得分:3)

这里可能有一些问题。首先,我认为documentation ...

中的评论
  

将boost :: asio :: io_service的实例传递给启动   函数会自动使其异步等待退出,   所以不需要等待

...在您显示的代码之后,请参见示例 。具体来说...

boost::asio::io_service ios;
std::vector<char> buf(4096);

bp::child c(bp::search_path("g++"), "main.cpp", bp::std_out > boost::asio::buffer(buf), ios);

ios.run();
int result = c.exit_code();

通过引用将io_service传递给child ctor。

此评论也有些误导。的确,随后对ios.run() 的调用确实是异步等待退出的,但同时也出现了(提升1.71.0)退出代码并没有像人们希望的那样固定。退出代码以...的形式存储在child类中。

std::shared_ptr<std::atomic<int>> _exit_status;

从源代码的快速扫描看来,_exit_status->store(...)仅从以下成员中调用...

boost::process::child::running
boost::process::child::wait
boost::process::child::wait_until

因此,即使ios.run()返回running中的一个或多个时,过程已经退出(假设一切顺利),也必须调用waitwait_until才能使可用的退出代码。

正如@sehe在其他地方评论的那样,这似乎是一种回归。如果我可以找到错误报告,则将对其进行更新。同时,解决方法是在c.wait()之前简单地调用c.exit_code()