gpt4 book ai didi

c++ - 如何确保我们从 boost::child 进程中读取所有行

转载 作者:可可西里 更新时间:2023-11-01 18:38:18 28 4
gpt4 key购买 nike

我在 boost::child 文档页面上看到了以下代码,其中解释了如何读取子进程的输出。 http://www.boost.org/doc/libs/1_64_0/doc/html/boost_process/tutorial.html他们说在运行你的子进程后,我们可以通过这个循环读取它:-

bp::ipstream is; //reading pipe-stream
bp::child c(bp::search_patk("nm"), file, bp::std_out > is);

//then later
while (c.running() && std::getline(is, line) && !line.empty())
data.push_back(line);

我在这里有 2 个问题:-

  1. 如果c.running() 返回false,我们就简单地退出循环。在那种情况下,上面的流 is 可能仍然携带丢失的数据?
  2. 同时读取 stdout 和 stderr 的最佳方法是什么,同时确保进程 exit() 不会造成死锁页面上有一条警告:-
    如果您在退出 nm 后尝试读取,管道将导致死锁

我希望同时捕获 stdoutstderr 而不必担心 nm 是否已经退出。

最佳答案

我认为除非使用异步方法,否则没有合适的方法。

也许你可以简单地获取一个 vector 的 future ,并在其中使用 string_views,如果你真的需要一行一行的话。

std::future<std::vector<char> > output, error;

boost::asio::io_service svc;
bp::child c(bp::search_path("nm"), file, bp::std_out > output, bp::std_err > error, svc);
svc.run();

要像在 vector 之上使用 istream 之前一样阅读:

#include <boost/process.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream_buffer.hpp>
#include <iostream>

namespace bp = boost::process;
namespace bio = boost::iostreams;
std::string const file = "./a.out";

int main() {
std::future<std::vector<char> > output, error;

boost::asio::io_service svc;
bp::child c(bp::search_path("nm"), file, bp::std_out > output, bp::std_err > error, svc);
svc.run();

//then later
{
auto raw = output.get();
std::vector<std::string> data;
std::string line;
bio::stream_buffer<bio::array_source> sb(raw.data(), raw.size());
std::istream is(&sb);

while (std::getline(is, line) && !line.empty())
data.push_back(line);

std::cout << data.at(rand()%data.size()) << "\n";
}

}

关于c++ - 如何确保我们从 boost::child 进程中读取所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45207006/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com