【问题标题】:boost::process async IO example doesn't work?boost::process 异步 IO 示例不起作用?
【发布时间】:2020-03-28 03:32:12
【问题描述】:

以下程序:

#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

【问题讨论】:

  • 在检索 exit_code 之前您不应该有一个c.wait() 吗?
  • @m88:请参阅文档中的示例。它没有一个。例子错了吗?
  • 这是什么平台/增强版? 1.71?它适用于我的 Boost 1.66。 ISTR 处理本机进程等待状态代码与退出代码的一些更改(请参阅stackoverflow.com/questions/57732569/…)。也许那里有些东西倒退了。
  • 这是 Coliru 的现场演示(增强版 1.66)coliru.stacked-crooked.com/a/8ffa1b882204a9cc
  • @sehe:是的,我使用的是 1.71

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


【解决方案1】:

这里可能存在一些问题。首先,我认为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-&gt;store(...) 似乎只被以下成员调用...

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

因此,即使进程已经退出(假设一切顺利),当ios.run() 返回runningwaitwait_until 中的一个或多个时,必须调用以使退出代码可用。

正如@sehe 在其他地方评论的那样,这看起来可能是一种回归。如果我能找到错误报告,我会更新它。与此同时,解决方法是在c.exit_code() 之前调用c.wait()

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-10-14
  • 2018-10-14
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
  • 2020-01-03
相关资源
最近更新 更多