3

少しの並列処理が役立つアプリケーションがあります。説明のために、10 個のテキスト ファイルを含むディレクトリがあり、10 個のプロセスをフォークして、それぞれがファイルの 1 つを取得し、ファイルの内容を大文字にするプログラムを開始したいとします。親プログラムは、待機関数の 1 つまたは選択関数を使用して、子プロセスが完了するのを待機できることを認めます。

私がやりたいことは、親プロセスが分岐した各プロセスの進行状況を監視し、プロセスの実行中に進行状況バーのようなものを表示することです。

私の質問。

フォークされたプロセスがこの情報を親プロセスに伝えるために、合理的な代替手段は何ですか? どのような IPC 手法を使用するのが合理的ですか?

4

6 に答える 6

2

このような進行状況だけを監視したい状況では、共有メモリを使用するのが最も簡単な方法です。すべてのプロセスは、共有メモリ ブロックの進捗値 (整数など) を更新し、マスター プロセスは定期的にブロックを読み取ります。基本的に、このスキームではロックは必要ありません。また、マスターが必要なときに情報を読み取ることができる「ポーリング」スタイルのアプリケーションであるため、進行状況データを処理するためのイベント処理は必要ありません。

于 2009-03-17T00:09:55.953 に答える
1

進行状況の更新だけが必要な場合、最も簡単な方法はおそらく匿名パイプを使用することです。pipe(2) 呼び出しは、パイプの両端に 1 つずつ、合計 2 つのファイル記述子を提供します。フォークする直前に呼び出し、親に最初の fd をリッスンさせ、子に 2 番目の fd に書き込みます。(これは、ファイル記述子とそれらを含む 2 要素配列の両方がプロセス間で共有されるため機能します。共有メモリ自体ではなく、コピーオンライトであるため、上書きしない限り値を共有します。)

于 2009-03-17T01:33:57.873 に答える
1

いくつかのオプション (あるとしても、どれがあなたに合っているかわかりません。「大文字のファイル」の類推とは対照的に、実際に何をしているかに大きく依存します):

  • 信号
  • fifos / 名前付きパイプ
  • 子またはその他の渡されたハンドルの STDOUT
  • メッセージ キュー (該当する場合)
于 2009-03-16T23:22:58.577 に答える
0

Boost.MPIは、このシナリオで役立つはずです。やり過ぎだと思うかもしれませんが、調査する価値があることは間違いありません:
www.boost.org/doc/html/mpi.html

于 2009-03-17T01:26:23.507 に答える
0

ちょうど今日、誰かがいつもパイプを使用していると私に言いました。これにより、すべてがうまくいっているという通知を子プロセスが親プロセスに送ることができます。これはまともな解決策のようであり、エラーを出力したいが stdout/stderr などにアクセスできない場所で特に役立ちます。

于 2009-03-16T23:20:26.463 に答える