You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

boost::asio::readable_pipe::read()是否存在?示例代码报错解惑

问题解答

你遇到的是Boost官网示例代码的笔误,boost::asio::readable_pipe确实没有read()成员函数,正确的做法是使用Boost.Asio的自由函数asio::read()。

错误原因

Boost.Asio中,像这种“读取直到完成”的操作并非IO对象(比如readable_pipe)的成员函数,而是以自由函数的形式提供的。readable_pipe的原生成员只有read_some()(读取部分数据)和async_read_some()(异步读取部分数据),而你需要的“读取到EOF”的逻辑,需要用顶层的asio::read()函数来实现。

修正后的代码

把报错的那行代码替换为:

asio::read(rp, asio::dynamic_buffer(output), ec);

完整修正后的代码:

#include <string>
#include <iostream>
#include <boost/asio.hpp>
#include <boost/asio/error.hpp>
#include <boost/asio/readable_pipe.hpp>
#include <boost/process/v2/process.hpp>
#include <boost/process/v2/stdio.hpp>
#include <boost/version.hpp>
#include <cassert>

int main()
{
    using namespace boost;
    using namespace boost::process::v2;

    asio::io_context ctx;
    asio::readable_pipe rp{ctx};

    boost::process::v2::process proc(ctx, "/usr/bin/g++", {"--version"}, process_stdio{{ /* in to default */}, rp, { /* err to default */ }});
    std::string output;

    system::error_code ec;
    asio::read(rp, asio::dynamic_buffer(output), ec);   // 修正后的读取调用
    assert(ec == asio::error::eof);
    proc.wait();
}

补充说明

asio::read()会自动循环调用read_some(),直到缓冲区被填满或者遇到EOF(对应示例中的asio::error::eof),完全符合原示例想要读取子进程全部输出的意图。

内容的提问来源于stack exchange,提问作者Pietro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 22:16:13