以下程序:
#include <boost/asio.hpp>
#include <boost/process.hpp>
#include <iostream>
namespace bp = boost::process;
int main() {
boost::asio::io_service ios;
std::vector<char> buf(4096);
bp::async_pipe ap(ios);
bp::child c("/bin/ls", bp::std_out > ap);
boost::asio::async_read(ap, boost::asio::buffer(buf),
[](const boost::system::error_code &ec, std::size_t size){});
ios.run();
int result = c.exit_code();
std::cout << result << std::endl;
}
输出383
。我希望它能输出0
。
这几乎是该示例的复制粘贴:
答案 0 :(得分:3)
这里可能有一些问题。首先,我认为documentation ...
中的评论将boost :: asio :: io_service的实例传递给启动 函数会自动使其异步等待退出, 所以不需要等待
...在您显示的代码之后,请参见示例 。具体来说...
boost::asio::io_service ios;
std::vector<char> buf(4096);
bp::child c(bp::search_path("g++"), "main.cpp", bp::std_out > boost::asio::buffer(buf), ios);
ios.run();
int result = c.exit_code();
通过引用将io_service
传递给child
ctor。
此评论也有些误导。的确,随后对ios.run()
的调用确实是异步等待退出的,但同时也出现了(提升1.71.0)退出代码并没有像人们希望的那样固定。退出代码以...的形式存储在child
类中。
std::shared_ptr<std::atomic<int>> _exit_status;
从源代码的快速扫描看来,_exit_status->store(...)
仅从以下成员中调用...
boost::process::child::running
boost::process::child::wait
boost::process::child::wait_until
因此,即使ios.run()
返回running
中的一个或多个时,过程已经退出(假设一切顺利),也必须调用wait
或wait_until
才能使可用的退出代码。
正如@sehe在其他地方评论的那样,这似乎是一种回归。如果我可以找到错误报告,则将对其进行更新。同时,解决方法是在c.wait()
之前简单地调用c.exit_code()
。