1

私は基本的にRVBファイルの各レイヤーでファジー化を実行するマルチプロセスプログラムに取り組んでいます。(1プロセス-> 1レイヤー)。各子プロセスは、次の関数を使用して一時ファイルを配信していますtmpfile()。各子プロセスがジョブを終了した後、メインプロセスは、作成された各一時ファイルを読み取り、データをアセンブルする必要があります。問題は、子のプロセスメモリにアクセスできないため、メインプロセス内の各一時ファイルを読み取る方法がわからないため、作成された一時ファイルへの一時ポインタが何であるかがわからないことです。

何か案が?

必要に応じて、遠慮なく説明を求めてください。

4

5 に答える 5

4

このtmpfile()関数は、明確な名前のないファイルへのポインターを返します。FILE実際、子プロセスでさえ、親は言うまでもなく、ファイルの名前をすぐに判断することはできません (多くの Unix システムでは、ファイルには名前がなく、リンクが解除されています)。tmpfile()呼び出し元に戻る前)。

extern FILE *tmpfile(void);

したがって、ファイル名を伝える必要がある場合は、間違った一時ファイル作成プリミティブを使用しています。

いくつかのオプションがあります:

  1. tmpfile()親と子の両方がファイルを共有できるように、親プロセスでファイル ストリームを作成します。対処すべき小さな調整の問題がいくつかあります。親は、子が書いたものを読む前に先頭に戻る必要があり、子が終了した後にのみそれを行う必要があります。
  2. 代わりに、ファイル名を生成するプリミティブの 1 つを使用してください。mkstemp()ファイル記述子の代わりに FILE ポインターが必要な場合は、使用fdopen()して作成できます。子から親へのファイル名を取得するという問題にまだ直面しています。繰り返しますが、親がファイルを開くか、各子にパイプを使用するか、共有メモリを使用するか、または ... IPC メカニズムを選択することができます。
  3. 分岐する前に、親に各子のパイプを開いてもらいます。子プロセスは、パイプの読み取り側を閉じ、書き込み側に書き込みます。親はパイプの書き込み側を閉じ、読み取り側から読み取るように手配します。ここで複数の子を持つ問題は、特定のパイプの容量が有限であることです (そして非常に小さい - 通常は約 5 KiB)。したがって、親がすべてのパイプを完全に読み取るようにする必要があります。ただし、すべてのデータが読み取られるまで子は終了できないことに注意してください (厳密には、最後のバッファーがいっぱいになるまですべてが読み取られます)。
  4. スレッドの使用を検討してください。ただし、スレッドを使用した調整の問題に注意してください。
  5. 複数の制御スレッドを使用する必要はなく (プロセスであろうとスレッドであろうと)、単にメイン プログラムに作業を行わせるだけであると判断します。これにより、調整と IPC の問題が解消されます。つまり、マシンのマルチコア プロセッサのメリットがなくなるということです。

これらのうち、並列実行が最も重要であると仮定すると、おそらくパイプを使用して子からファイル名を取得します (オプション 2)。調整の問題が最も少ないです。しかし、簡単にするために、「メイン プログラムがすべてを実行する」(オプション 5) を使用します。

于 2009-09-27T17:56:13.157 に答える
3

親プロセスで一時ファイルを作成してからフォークし、子プロセスにそれを使用させることができます。

于 2009-09-27T17:39:11.707 に答える
3

親プロセスで呼び出すとtmpfile()、子は開いているすべての記述子を継承し、ファイルに書き込むことができ、開いているファイルには親もアクセスできます。

于 2009-09-27T17:39:36.563 に答える
1

子プロセスは、ファイル記述子を親プロセスに送り返すことができます。

編集:APUEサイトのサンプルコード(src.tar.gz / apue.2e / lib、recvfd.c、sendfd.c)

于 2009-09-27T17:23:02.947 に答える
0

サブプロセスの代わりにスレッドを使用しますか? 一時ファイルの名前を別のファイルに入れますか? 一時ファイルにランダムな名前を使用しないでください。ただし、(たとえば) 親プロセスの pid に基づいた名前 (プログラムの複数のインスタンスを同時に実行できるようにするため) と連番を使用しますか?

于 2009-09-27T17:41:41.890 に答える