2017-10-11 11 views
0

C++のRaspberry Pi/Raspbianでアプリケーションをコーディングしています。 mkfifo()で名前付きパイプ(FIFO)を作成してから、カメラから画像を取得するためにraspiyuvを開始します。メモリの場合、raspiyuvは、静止画をYUVファイルとして保存するRaspberry Piコマンドラインアプリケーションです。C++アプリケーションから子プロセスとしてRaspberry Piカメラアプリケーションを正しく生成できません。

私はg ++ 6.3とブースト1.64を-std = C++ 17で使用しています。私が作成するFIFOは、コマンドラインから使用できるという意味で正しいです。それは期待どおりに動作します。

バグは、アプリケーションraspiyuvが、私はすぐに終了コード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を送信するまでアイドル状態になり、イメージをキャプチャしてFIFOにストリームし、アイドル状態を返します。それはいいです。

boost::process::childオブジェクトを作成してスポーンすると、すぐに戻ります。

これを修正し、私のアプリケーション(親プロセス)が生存していて、SIGKILLなどを送信しない限り、boost::process::childが生き続けることを許可する考え方はありますか?

ありがとうございました!

答えて

0

boost::process::childは、メインプロセスと非同期で実行されます。同期動作を必要とする場合は、を参照してください。boost::process::systemなどの同期手段でlProcess.wait() を起動するか、raspiyuvを起動する必要があります。

EDIT: あなたは(あなたの編集やコメントが示しているように見えるよう)非同期に他のプロセスをしたい場合は、あなたが本当にしてみてくださいすることは私には不明で次のようになります。

バグがあることですアプリケーションraspiyuv私はすぐに返す 終了コード0と返す。

どのようなバグですか? docs of boost::process::childすることにより、何が期待されているかを正確にです:

  • int型exit_code()constは
      。 exit_codeを取得します。返り値は、子が待たれていなかったり、終了した場合は、 の意味がありません。
  • あなたのコードはどこにも終了する子供のために待機していないと文書化のようなので、終了コードを取得します。

    +0

    実際には、私は_asynchronously_を実行します。子プロセスに__SIGUSR1__シグナルを送ることで、それを散発的に同期させます。私が望むのは、スレッドのように非同期に実行する子プロセスです(しかし、別のプロセスです)。どんな方法でも...私はコンピュータにアクセスするときに 'boost :: process :: system'を試してみます。 –

    +0

    子プロセスが非同期であることを期待していた場合は、実際には何が問題なのか分かりませんので、私は自分の答えを拡張しました。 –

    +0

    問題は、 'raspiyuv ... -t 0 -s ... 'を起動すると、SIGUSR1が実際のイメージキャプチャをトリガするのを待っている(永遠に)アイドル状態になるはずです。コード0ですぐに返されるべきではありません。 –

    関連する問題