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