APUEから
FIFOを使用して、一連のシェル
コマンドで出力ストリームを複製することができます。 。これにより、中間ディスクへのデータの書き込みが防止されます
ファイル (中間のディスクファイルを避けるためにパイプを使用するのと同様です。)ただし、パイプはプロセス間の線形接続にのみ使用できますが、
FIFOには名前が付いているため、
非線形接続に使用できます。 。フィルタリングされた入力ストリームを
2回処理する必要がある手順を考えてみましょう。mkfifo fifo1 prog3 < fifo1 & prog1 < infile | tee fifo1 | prog2
FIFOを作成してから、バックグラウンドでprog3を開始し、FIFOから
を読み取ります。次に、prog1を開始し、teeを使用してその入力を
FIFOとprog2の両方に送信します。
-
FIFOはどのようにして「一連のシェルコマンドで出力ストリームを複製する」のでしょうか。これは
tee
によって行われていませんか FIFOの代わりに? -
この例では、
mkfifo fifo1
現在のディレクトリにファイルを作成し、fifo1
通常のファイルに置き換えられるようです。では、FIFOの「中間ディスクファイルへのデータの書き込みを防ぐ」ことのポイントは何ですか? -
プロセス間の「線形接続」と「非線形接続」とはどういう意味ですか? FIFOは非線形接続に使用できるのに対し、パイプはプロセス間の線形接続にのみ使用できるとはどういう意味ですか?
ありがとう。
承認された回答:
-
APUEは「FIFOは使用可能」と述べています 出力ストリームを複製する」とは、FIFOが実際に出力ストリームを複製することを意味するものではありません。ご指摘のとおり、複製は
tee
によって行われます。 例では。 -
mkfifo
FIFOを作成します。これは、含まれているディレクトリに「ファイル」として表示されます。ただし、FIFOへの書き込みは、データがディスクにヒットしないため、ファイルへの書き込みとは異なります。名前付きまたはその他の方法で、パイプはデータのストレージを提供せず、通信チャネルを提供します。パイプの書き込み側は、レシーバーがない場合はデータを書き込むことができません。パイプはデータを保存せずに渡すだけです。 (ほとんどのシステムでは、パイプは パフォーマンスを向上させるために、小さなカーネルバッファに支えられていますが、これは実装の詳細です。) -
プロセス間の線形接続は、線形グラフとして表すことができるパイプです。この例では、最後の行を次のように表すことができます
infile → prog1 → tee fifo1 → prog3
これは線形ですが、チェーン全体を表現しようとして、処理要素に還元する場合は、
が必要です。infile → prog1 → prog2 → prog3
これは非線形です(グラフには
prog1
という1つのノードがあります 、2つの出口ノードがあります。