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

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

APUEから

FIFOを使用できます。一連のシェルコマンドで出力ストリームをコピーします。。これデータが中間ディスクファイルに書き込まれないようにする(中間ディスクファイルを避けるためにパイプを使用するのと似ています)。

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

フィルタリングされた入力ストリームを2回処理する必要があるプロセスを考えてみましょう。

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

FIFOを作成し、バックグラウンドでprog3を起動してFIFOからデータを読み込みます。その後、prog1を起動し、teeを使用して入力をFIFOとprog2に送信します。

  1. FIFO「一連のシェルコマンドにわたって出力ストリームを複製する」方法は? FIFOを使用して行われませんかtee

  2. 例では、mkfifo fifo1現在のディレクトリにファイルが作成され、通常fifo1のファイルに置き換えることができます。それでは、「データが中間ディスクファイルに書き込まれるのを防ぐ」FIFOのポイントは何ですか?

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

ありがとうございます。

答え1

  1. APUEは「先入れ先出し(First in First Out)」と言います。利用できる「出力ストリームのコピー」では、FIFOが実際に出力ストリームをコピーするとは言いませんtee

  2. mkfifo埋め込みディレクトリに「ファイル」と表示されるFIFOを作成しますが、データがディスクに到達しないため、FIFOに書き込むことはファイルに書き込むのとは異なります。パイプは、名前付きパイプでも他のパイプでもデータ保存を提供しませんが、受信者なしで通信チャネルを提供します。パイプの書き込み端はデータを書き込むことができず、パイプはデータを転送するだけでデータを保存しません。 (ほとんどのシステムパイプからはいパフォーマンスを向上させるために小さなカーネルバッファとしてサポートされていますが、これは実装の詳細です。 )

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

    infile → prog1 → tee fifo1 → prog3
    

    これは線形ですが、処理する要素が少ないチェーン全体を表すには、次のものが必要です。

    infile → prog1 → prog2
                   → prog3
    

    これは非線形です(グラフにノードがあり、prog12つの終端ノードがあります)。

関連情報