web-dev-qa-db-ja.com

FIFO vs一時ファイルまたはパイプを使用する目的は何ですか?

APUEから

FIFOを使用して、一連のシェルコマンドで出力ストリームを複製する。これ中間ディスクファイルへのデータの書き込みを防止します(中間ディスクファイルを回避するためにパイプを使用するのと同様)。

ただし、パイプはプロセス間の線形接続にのみ使用できますが、a FIFOには名前があるため、非線形接続に使用できます。

フィルタリングされた入力ストリームを2回処理する必要がある手順について考えてみます。

mkfifo fifo1
prog3 < fifo1 &
prog1 < infile | tee fifo1 | prog2

FIFOを作成し、FIFOから読み取ってバックグラウンドでprog3を開始します。次に、prog1を開始し、teeを使用して入力を両方のFIFOおよびprog2。

  1. FIFO "一連のシェルコマンドで出力ストリームを複製する"はどうすればよいですか?これはFIFOではなくteeによって行われますか?

  2. この例では、mkfifo fifo1は現在のディレクトリにファイルを作成し、fifo1は通常のファイルに置き換えられるようです。では、FIFO "中間ディスクファイルへのデータの書き込みを防ぐ"のポイントは何ですか?

  3. プロセス間の「線形接続」と「非線形接続」とはどういう意味ですか? a FIFOは非線形接続に使用できますが、パイプはプロセス間の線形接続にのみ使用できるということはどういう意味ですか?

ありがとう。

1
Tim
  1. APUEは、「FIFO 使用可能出力ストリームを複製する」と述べていますが、FIFOが実際に出力ストリームを複製しているとは言いません。ご指摘のとおり、この例では、複製はteeによって行われます。

  2. mkfifoはFIFOを作成します。これは、含まれているディレクトリに「ファイル」として表示されます。ただし、FIFOへの書き込みは、データがディスクにヒットしないため、ファイルへの書き込みとは異なります。名前付きパイプまたはその他のパイプは、データのストレージを提供せず、通信チャネルを提供します。パイプの書き込み側は、レシーバーがない場合はデータを書き込むことができず、パイプはデータを格納せずにデータを渡すだけです(ほとんどのシステムでは、パイプareパフォーマンスを向上させるために、小さなカーネルバッファーに支えられていますが、これは実装の詳細です。)

  3. プロセス間の線形接続は、線形グラフとして表すことができるパイプです。この例では、最後の行を次のように表すことができます。

    infile → prog1 → tee fifo1 → prog3
    

    これは線形ですが、チェーン全体を表現しようとして、処理要素に還元する場合は、

    infile → prog1 → prog2
                   → prog3
    

    これは非線形です(グラフには1つのノードがあります。prog1、2つの出口ノードがあります)。

5
Stephen Kitt