0

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 などを送信しない限り、生き続けることを許可するアイデアはありますか?

ご協力いただきありがとうございます!

4

1 に答える 1