問題タブ [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 はどこにありますか?
プログラムを実行し、その stdout 出力を C++ で取得する必要があります。私のコードもクロスプラットフォームにしたいです。
最近、すべてのクロス プラットフォームのニーズに対応する Boost C++ ライブラリの素晴らしい世界を発見したので、boost.org にアクセスして Boost.Process のドキュメントを読んでみようと思いました。驚いたことに、そこにはありませんでした。次に、Boost が外部プロセスを開始するためにクロスプラットフォーム ライブラリに付けた名前を調べましたが、これまでのところ見つけることができませんでした。
Google で検索すると、Julio M. Merino Vidal のBoost.Processにたどり着きました。これは、私が探していた非公式の Boost ライブラリのようです。奇妙なことに、その Web サイトにダウンロード リンクが見つからないようです。また、プロジェクトに関する最近の進展はないようです。
ようやく Vidal の Boost.Process のダウンロード リンクを外部サイトで見つけることができたので、今はそれを使用しますが、クロス プラットフォームの C++ ライブラリを手に入れるために費やした労力にはかなり驚かされます。外部プロセスと対話します。
では、なぜ公式の Boost.Process がないのでしょうか? とても貴重な追加になりそうです。それとも、ここで明らかな解決策を完全に見落としていますか? 外部プロセスの簡単な開始と相互作用を管理するための他のクロスプラットフォーム ライブラリを提案していただけないでしょうか?
c++ - 後で初期化するためのユーザー定義型の変数の宣言
process
最初は何も割り当てずに呼び出されるグローバル変数を作成したいと考えています。後で、オペレーティング システムで新しいプロセスを生成し、その変数に割り当てます。
次のように C# で実行できます。
C++で同じことを達成するために、以下のコードを書きました。process
変数の型は( child
Boost ::Process v0.31 から) です。#includesは、簡単にするために省略されています。
Test.hpp
テスト.cpp
メイン.cpp
ただし、Test.cppに対して次のエラーが返されます。
エラー C2512: 'boost::process::child': 適切な既定のコンストラクターがありません
どうすれば正しく行うことができますか?
c++ - Boost を使用して子孫プロセスの作成を監視する
プログラムで子プロセスを作成する可能性のあるプロセス (プロセス X としましょう) を作成していますが、子プロセスも作成する可能性があり、プロセス ツリーがいつ終了したか (= すべての子孫が終了したか) を判断できません。
そうするための直接的な Boost アプローチは見つかりませんでした。
私の(防弾ではない)解決策は、リスト内のプロセスXのみから始めて、監視対象プロセスのリストを維持し、システム内のプロセスを定期的に監視し、その親IDがリストにあるプロセスを検出したら、それを追加することでしたプロセス ID もリストに追加します。リスト内のすべてのプロセスが終了したことを示す監視サイクルに到達すると、プロセス ツリーが終了します。
このアプローチの 2 つの主要な問題は次のとおりです。
プロセスが「抜け落ちる」可能性があります。次のフローを検討してください。
監視サイクルが終了し、リストは [X] です。
プロセス X はプロセス Y を作成し、プロセス Y は Z を作成して終了します。
監視サイクルが開始されました - プロセス Y
は終了しているため検出されず、プロセス Y が検出されなかったためプロセス Z も検出されません。
このタイプの監視は、問題 1 で説明したこれらの「スリップ」を最小限に抑えるために非常に頻繁に実行する必要があるため、非常にリソースを消費します。
私のプログラムで使用されるいくつかのコード スニペット:
プロセス X の作成:
プロセス X の監視 (単純で不十分なケース):
重要事項:
- 子プロセス (プロセス X) を制御することはできません。また、それが何をするのか、どのプロセスが生成されるのかもわかりません。
- 私のソリューションは、Windows と Linux の両方に準拠する必要があります (不可能な場合は、プログラムに OS 固有のコードを含める必要がありますが、これは (今まで) OS に依存していませんでした)。
boost-process - Boost Process : プロセスの出力をファイルにリダイレクトするにはどうすればよいですか?
Boost::Process ライブラリを使用してプロセスを起動すると、stdout からの出力を問題なく読み取ることができます。ただし、代わりに標準出力をファイルにリダイレクトしたい場合は、どうすればよいでしょうか?
python - boost::process 0.5 を使用します。python.exe の stdio をリダイレクトできません
私は、python.exe (2.7) を起動し、stdin、stdout、および stderr を使用して操作できるようにする Windows でいくつかの C++ を使用しています。Visual Studio 2015、Boost 1.59、および Boost Process 0.5 を使用しています。
「python -c "print 'hello world'」などのコマンド ラインを設定して python.exe を起動すると、stdout で「hello world」がキャプチャされます。
そのコードは次のとおりです。
set_cmd_line() を削除するか、文字列を L"python" に変更すると、コマンド ラインから "python.exe" を実行した場合と同様に、Python が対話モードで起動することが期待されます。
そのコードはここにあります:
2 番目の例を実行すると、python が一瞬だけ実行され、その後終了します。
このプログラムの背景。Python ファイルを 1 行ずつ読み取り、インタープリターで記述されているかのように 1 行ずつ実行する Python ロガーを作成したいと考えています。したがって、次のようなコードになります。
私はブーストに縛られていません。Poco やMSDN Windows の例 hereなどの他のオプションを試しましたが、成功しませんでした。
もちろん、stdout/stderr を正しくパイプ処理した後は、stdin も機能するようになります。私もそれを機能させようとしましたが、失敗しました。
前もって感謝します!
c++ - Visual Studio 2015: `char * * __cdecl __p__environ(void)` が見つかりません
私はVS2015 WIN64でboost.processをビルドしようとしています(VS2010 WIN32とWIN64で問題なくビルドしました)。
char * * __cdecl __p__environ(void)
リンカーは、見つからないことについて不平を言っています。
このリンクの問題につながるコードは次のとおりです。
char *environ = ::GetEnvironmentStrings();
by に置き換えてchar *environ = NULL;
も問題は解決しません。ブロック全体にコメントすると、問題が修正されます。
c++ - Boost.Process wait_for_exit(child): クラッシュ?
のバージョン 0.5 を使用していBoost.Process
ます。ドキュメントはここにあります。Mac OS X Yosemite を使用しています。
私の問題: コンパイルを子プロセスとして起動しています。プロセスが完了するのを待ちたいと思います。
子プロセスが正しくコンパイルされると、すべて問題ありません。
しかし、子プロセスがコンパイルされない場合、 を呼び出すとコードがクラッシュするようboost::process::wait_for_exit
です。
私のユーザーコードは次のようになります。
編集: コードは、最新のより正確なバージョンに一致するように編集されています (まだ機能しません)。
の内部実装bp::wait_for_exit
:
::waitpid
コンパイル コマンドが失敗すると、後のコードには到達しません。表示されるエラーは、「子が終了しました。pid: xxxx; uid: yyy; 終了値: 1」です。
質問:
- これはバグですか、それとも私が誤用していますか
boost::process::wait_for_exit
。 - 移植可能なクラッシュを回避するための回避策はありますか?
c++ - プロセスが終了した場合のBoost.Processチェック
プロセスが終了したかどうかを確認することは可能ですか?
を呼び出したくありません.wait()
。ブロックしているためです。また、タイムアウトを管理したいので、プロセスを終了します。
今、私は次のコードを持っています:
ただし、終了を待たず、プロセスが正常に終了したかどうかを確認しません。