私はboost::process::child
とboost::process::async_pipe
を使用してアプリケーションを起動し、このときにいつでもアプリが出力するすべてのものを非同期的に(boost::asio
を介して)読み込みます。ブーストプロセスの実行()とスレッドセーフティーのexit_code()
child::running()
メソッドを使用してアプリケーションが生存しているかどうかもチェックしたいと思います。実行していない場合は、child::exit_code
を使用して終了コードを読みたいと思います。
非常に便利ですESPECIALLYこれはアプリケーションが予期せずクラッシュしたり終了したりするのを通知する方法です(私はより良い方法を見つけることができませんでした)。アプリがコールバックを終了するときにboost::system::error_code
が設定されて呼び出されます。
async_pipe::async_read_some
というコールバックでこれらの2つの方法を使用できるかどうか知りませんか?
一般に、より簡単な質問は、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();
}
私が気づいていない素敵な機能です。私にチェックさせて、私はあなたに戻ってきます。 –
あなたのための質問があります:このboost :: process :: on_exitがどこで実行されているか知っていますか?すべてのboost :: asioハンドラで発生するので、どのスレッドでも実行できるコールバックですか? –
私がテストした後も、子アプリケーションがクラッシュした場合、このハンドラは呼び出されないことがわかります。だから、クラッシュについて通知される最良の方法が何であるかまだ分かりません。アプリケーションが実行されておらず、正しく終了していない場合は例外がスローされます。 –