C++ boost::进程异步IO示例不';不行?

C++ boost::进程异步IO示例不';不行?,c++,linux,boost,boost-asio,boost-process,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);

以下节目:

#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;
}
#包括
#包括
#包括
名称空间bp=boost::process;
int main(){
boost::asio::io_服务ios;
std::载体buf(4096);
异步管道ap(ios);
bp::子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.退出_代码();

std::cout这里可能有一些问题。首先,我认为在

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

…指的是您显示的代码后面的示例。特别是

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();
从源代码的快速扫描来看,
\u exit\u status->store(…)
似乎只从以下成员调用

boost::process::child::running
boost::process::child::wait
boost::process::child::wait_until
因此,即使当
ios.run()
返回一个或多个
running
时进程已经退出(假设一切顺利),也必须调用
wait
wait_,直到
才能使用退出代码


正如@sehe在别处所评论的,这看起来可能是一个回归。如果我能找到一个bug报告,我会更新它。同时,解决方法是在
c.wait()之前调用
c.wait()
。你不应该有
c.wait()吗
在检索退出代码之前?@m88:请参阅文档中的示例。它没有。示例是否错误?这是什么平台/boost版本?1.71?它与boost 1.66配合使用。是否对本机进程等待状态代码与退出代码进行了一些更改(请参阅)。可能有什么倒退。这是Coliru的实时演示(boost版本1.66)@sehe:是的,我使用的是1.71,谢谢你深入研究。看起来确实是一个明显的错误。提醒我不要轻易接受拉请求。这实际上是一个错误,因为整个等待处理只有在你在退出时传入
时才会发生。它会对此进行过滤,如果没有异步事件的处理程序,它就会被忽略。@KlemensMorgenstern:我在这里打开了github问题,并链接到这个问题:
boost::process::child::running
boost::process::child::wait
boost::process::child::wait_until