【发布时间】:2017-12-05 12:25:11
【问题描述】:
我正在使用boost::process::child 和boost::process::async_pipe 启动应用程序并异步读取(通过boost::asio)应用程序在发生这种情况时在屏幕上输出的所有内容。
我还想使用child::running() 方法检查应用程序是否处于活动状态;如果没有运行,我想使用child::exit_code 读取退出代码。
这是非常有用的特别是,因为它是一种通知应用程序崩溃或意外退出的方法(我找不到更好的方法);当应用程序退出时,将调用回调并设置boost::system::error_code。
你知道我是否可以在async_pipe::async_read_some调用的回调中使用这两个方法吗?
一般来说,更简单的问题是 child::running() 和 child::exit_code() 是否是线程安全的(在 Windows 和 Linux 中)。
namespace bp = boost::process;
char my_buffer[1024];
boost::asio::io_service io;
bp::async_pipe in_pipe(io);
void handle_pipe_read(const boost::system::error_code &ec, std::size_t bytes_transferred);
void schedule_read() {
in_pipe.async_read_some(
boost::asio::buffer(my_buffer),
boost::bind(&handle_pipe_read,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void handle_pipe_read(
const boost::system::error_code &ec,
std::size_t bytes_transferred
)
{
// Q: Is this call possible? 'handle_pipe_read' can run in any thread
if(c->running())
std::cout << "I am alive" << std::endl;
else
std::cout << "EXIT CODE:" << c->exit_code() << std::endl;
if(ec) return; //app probably exit
// Do something with buffer and re-schedule
schedule_read();
}
int main() {
bp::child c("my_program_url", bp::std_out > in_pipe);
any_c = &c;
schedule_read();
io.run();
}
【问题讨论】:
标签: c++ pipe ipc boost-asio boost-process