async_read в дочернем процессе async_pipe, не содержащем данных

У меня есть следующий код, который упрощен от моего реального кода, где я пытаюсь сделать async_read для async_pipe, подключенного к дочернему процессу. В дочернем процессе я называю «ls». просто как тест, и я хочу, чтобы мое асинхронное чтение получило результат этого. Возвращает следующее

$ ./a.out
system:0
0

Почему это происходит, я не могу понять? В идеале я хочу заменить «ls». с длительным процессом, где я могу читать строку за строкой с async_read.

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <fstream>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <boost/process.hpp>

namespace bp = boost::process;

class test {
private:
boost::asio::io_service ios;
boost::asio::io_service::work work;
bp::async_pipe ap;
std::vector<char> buf;

public:
test()
: ios(), work(ios), ap(ios) {
}

void read(
const boost::system::error_code& ec,
std::size_t size) {
std::cout << ec << std::endl;
std::cout << size << std::endl;
}

void run() {
bp::child c(bp::search_path("ls"), ".", bp::std_out > ap);
boost::asio::async_read(ap, boost::asio::buffer(buf),
boost::bind(&test::read,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));

ios.run();
}
};

int main() {
test c;
c.run();
}

1

Решение

Вы читаете в вектор размером 0.

Вы прочитали 0 байтов. Это то, что вы просили.

Я бы предложил использовать streambuf и просто читать до EOF. Кроме того, падение work если вы действительно не хотите run() никогда не возвращаться:

Жить на Колиру

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/process.hpp>
#include <iostream>

namespace bp = boost::process;

class test {
private:
boost::asio::io_service ios;
bp::async_pipe ap;
boost::asio::streambuf buf;

public:
test() : ios(), ap(ios) {}

void read(const boost::system::error_code &ec, std::size_t size) {
std::cout << ec.message() << "\n";
std::cout << size << "\n";
std::cout << &buf << std::flush;
}

void run() {
bp::child c(bp::search_path("ls"), ".", bp::std_out > ap, ios);

async_read(ap, buf, boost::bind(&test::read, this, _1, _2));

ios.run();
}
};

int main() {
test c;
c.run();
}

Отпечатки, например

End of file
15
a.out
main.cpp
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]