C++ で Raspberry Pi/Raspbian でアプリケーションをコーディングしています。名前付きパイプ (FIFO) を作成し、raspiyuvmkfifo()
を起動してカメラから画像を取得します。メモリの場合、raspiyuvは、静止画像を取得して YUV ファイルとして保存する Raspberry Pi コマンド ライン アプリケーションです。
-std=c++17で g++ 6.3 と Boost 1.64 を使用しています。私が作成した FIFO は、コマンド ラインから使用できるという意味では正しいです。期待どおりに動作します。
バグは、アプリケーションraspiyuv I spawn が終了コード 0 ですぐに戻ることです。
私のコード:
void myFunction()
{
// Create the FIFO here with mkfifo(); // Works fine...
boost::filesystem::path lExecPath =
boost::process::search_path( "raspiyuv" ); // returns correct path
boost::process::child lProcess( lExecPath, "-w 2592 -h 1944 -o - -t 0 -y -s >> /var/tmp/myfifo" );
int lPID = lProcess.id(); // Seems to be correct
int lExitCode = lProcess.exit_code(); // Returns immediately with 0
}
$ raspiyuv -w 2592 -h 1944 -o - -t 0 -y -s
コマンドラインに直接入力すると、コマンドは正しいです。また、FIFO へのリダイレクトも正しく機能します。-w 2592 -h 1944
取得した画像のサイズを指定し、-o -
画像を stdout に出力することを-t 0
意味し、永久に待機-y
することを意味し、Y チャネルのみを保存することを-s
意味し、SIGUSR1 が画像キャプチャをトリガーするのを待機することを意味します。
コマンド ラインから呼び出すと、アプリケーションは SIGUSR1 を送信するまでアイドル状態になり、イメージをキャプチャして FIFO にストリーミングし、アイドル状態に戻ります。それはいいです。
オブジェクトを作成してスポーンすると、boost::process::child
すぐに戻ります。
boost::process::child
これを修正し、アプリケーション (親プロセス) が生きていて、SIGKILL などを送信しない限り、生き続けることを許可するアイデアはありますか?
ご協力いただきありがとうございます!