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
相关产品推荐
相关产品推荐

