dup2を使用して入力ファイルから読み取り、exec関数の入力にリダイレクトしたいと思います。しかし、私の問題は、3つの実行中のプロセスがあり、それらすべてが同じ入力ファイルを開く必要がありますが、それらは異なるジョブを実行することです。そのような場合、あなたは何を提案しますか?「catdata.txt」を使用して他の3つのプロセスの入力をフィードできるかどうかはわかりませんが、その方法はわかりません。
2 に答える
各リーダーが複製されたファイル記述子を介してファイルにアクセスすると、すべてのリーダーがファイル オフセットを共有し、問題が発生する可能性があります。
echo cat dog mouse fish bird | run_each prog1 prog2 prog3
上記の例で、プログラム run_each がコマンドライン引数として与えられた実行プログラムを開いて、それぞれに標準入力の複製バージョンを与える場合、prog1 は「cat」、prog2 は「dog mouse」、prog3 は次のようになります。 " 鳥"。この場合、dup2 を呼び出しても、長期的には実際には何も行われません。
run_each プログラムを変更して、パラメーター -stdin= を取るようにすると、そのファイルが開き、各子プログラムの標準入力としてそのファイルが dup2 されます。
echo cat dog mouse fish bird > ./some-file.txt
run_each -stdin=./some-file.txt prog1 prog2 prog3
この例では、シーク可能な通常のファイルを使用しているため、おそらく扱っているものに少し近いですが、各 prog# のすべての標準入力ファイルがオフセットを共有するため、最初の例と同じ問題が発生します。 /シーク位置。
各プログラムがすべての読み取りに対して pread を呼び出した場合 (読み取りがすべて行われたと仮定しますが、pwrite もあると仮定します)、この例では機能します (ただし、最初のプログラムは機能しません)。ただし、実際には開く必要があります。子プログラムのそれぞれが、標準入力で他に何が起こっているのかを知る必要がないように、ファイルを数回更新します。
このファイルに書き込んでおらず、ファイルから読み取るだけである限り、いくつのプロセスがファイルを読み取っているのかは問題ではありません。