Код: Выделить всё
boost::asio::io_context gContext;
namespace bp = boost::process::v2;
struct Subprocess {
bp::process process;
std::string output;
};
// ...
auto pipe_stdout = std::make_unique(gContext);
auto pipe_stderr = std::make_unique(gContext);
auto subprocess = std::make_unique(Subprocess{
bp::process(gContext, "/bin/sh", { "-c", "my command" },
bp::process_stdio{ nullptr, *pipe_stdout, *pipe_stderr }),
std::string{} });
for (auto* pipe : { &pipe_stdout, &pipe_stderr }) {
boost::asio::co_spawn(
gContext,
[pipe = std::move(*pipe),
output = &subprocess->output]() -> boost::asio::awaitable {
while (true) {
std::array buf;
size_t len = co_await pipe->async_read_some(
boost::asio::buffer(buf), boost::asio::use_awaitable);
if (len == 0 && !pipe->is_open()) {
co_return;
}
output->append(buf.data(), len);
}
},
boost::asio::detached);
}
Код: Выделить всё
finished_Код: Выделить всё
subprocess->process.async_wait(
[this, p = subprocess.get()](bp::error_code ec, int exit_code) {
assert(!ec);
auto it = std::ranges::find_if(
running_, [p](const auto& up) { return up.get() == p; });
finished_.emplace_back(std::move(*it));
running_.erase(it);
});
Код: Выделить всё
while (true) {
while (!running_.empty() && finished_.empty()) {
gContext.run_one();
}
if (finished_.empty()) {
continue;
}
// process finished_.back(), get its output, etc.
finished_.pop_back();
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... -terminati
Мобильная версия