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
が生き続けることを許可する考え方はありますか?
ありがとうございました!
実際には、私は_asynchronously_を実行します。子プロセスに__SIGUSR1__シグナルを送ることで、それを散発的に同期させます。私が望むのは、スレッドのように非同期に実行する子プロセスです(しかし、別のプロセスです)。どんな方法でも...私はコンピュータにアクセスするときに 'boost :: process :: system'を試してみます。 –
子プロセスが非同期であることを期待していた場合は、実際には何が問題なのか分かりませんので、私は自分の答えを拡張しました。 –
問題は、 'raspiyuv ... -t 0 -s ... 'を起動すると、SIGUSR1が実際のイメージキャプチャをトリガするのを待っている(永遠に)アイドル状態になるはずです。コード0ですぐに返されるべきではありません。 –