問題タブ [boost-process]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - boost::process 0.6 へのリンク時の「複数定義」エラー
このリンクエラーで少し迷っています。問題はライブラリ自体ではなく自分の側にあると思いますが、これを解決する方法がわかりません。
boost::process 0.6 https://github.com/klemens-morgenstern/boost-process/にリンクしようとしています
main.cpp
レコーダー.cpp
レコーダー.h
c++ - サブプロセスの起動時の競合状態により、パイプからの読み取りがハングする
それぞれ子プロセスを起動する 2 つのスレッドがあります。最初のアプリケーションは、非常に長時間実行されるバイナリーです。2番目は非常に迅速に終了します。
これが失敗することがある競合状態があります。以下に、実行可能な最小限のコード例を示します。
標準の fork / execve / dup2 システムを使用する Boost Process 0.5 を使用します。ブースト プロセスがどのように機能するかについてはいくつかのハックがありますが、一般的には非常にうまく機能します。
親プロセスはさらに多くのプロセスを起動し、一般的には機能します。
特にインターリーブできない部分がわからないため、プロセスを一度に 1 つずつ簡単に起動することはできません。
なぜこれがハングするのかについてのアイデアはありますか?
期待される出力:
ただし、常にではありませんが、多くの場合、std_err_pipe で停止します。
(process-test.cpp として保存し、でコンパイルしますg++ process-test.cpp -o process-test -lboost_iostreams -lboost_filesystem -lboost_thread -lboost_system
)
c++11 - Boost::Boost::Process::posix::use_vfork との組み合わせでのプロセス リンカ エラー
私はBoost::Process
(1.64.0) をいじり、GCC 7.1.1 を使用してvfork()
、プロセスをフォークするときに の使用を強制しようとしています。次のプログラムのリンカー エラーが表示されます。
使用:
生成されるリンカ エラーは次のとおりです。
関数 'boost::process::detail::posix::executor >、boost::fusion::filter_view&、boost::process::detail::posix::use_vfork_ const&> const、boost::process::detail 内::is_initializer > > > >::operator()()': spawn_simple.cpp:(.text._ZN5boost7process6detail5posix8executorINS_6fusion10joint_viewINS4_5tupleIJNS2_12exe_cmd_initIcEEEEENS4_11filter_viewIKNS6_IJRA6_KcRNS2_8null_outILi1ELin1EEERKNS2_10use_vfork_EEEENS1_14is_initializerIN4mpl_3argILin1EEEEEEEEEEclEv[_ZN5boost7process6detail5posix8executorINS_6fusion10joint_viewINS4_5tupleIJNS2_12exe_cmd_initIcEEEEENS4_11filter_viewIKNS6_IJRA6_KcRNS2_8null_outILi1ELin1EEERKNS2_10use_vfork_EEEENS1_14is_initializerIN4mpl_3argILin1EEEEEEEEEEclEv]+0x31): undefined reference to `boost::process::detail::posix::executor > 、boost::fusion::filter_view&、boost::process::detail::posix::use_vfork_ const&> const, boost::process::detail::is_initializer > > > >::invoke(mpl_::bool_, mpl_::bool_)'
私の知る限り、Boost Process 自体はヘッダーのみなので、未定義の参照について不平を言っているのはなぜboost::process<...>::invoke()
ですか?
と を追加-lboost_system
してみまし-lboost_iostreams
たが、リンカー エラーは解決しません。
c++ - C++ アプリから子プロセスとして Raspberry Pi カメラ アプリケーションを正しく生成できない
C++ で Raspberry Pi/Raspbian でアプリケーションをコーディングしています。名前付きパイプ (FIFO) を作成し、raspiyuvmkfifo()
を起動してカメラから画像を取得します。メモリの場合、raspiyuvは、静止画像を取得して YUV ファイルとして保存する Raspberry Pi コマンド ライン アプリケーションです。
-std=c++17で g++ 6.3 と Boost 1.64 を使用しています。私が作成した FIFO は、コマンド ラインから使用できるという意味では正しいです。期待どおりに動作します。
バグは、アプリケーションraspiyuv I spawn が終了コード 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 などを送信しない限り、生き続けることを許可するアイデアはありますか?
ご協力いただきありがとうございます!