GNU/Linux >> Linux の 問題 >  >> Linux

Fifoと一時ファイルまたはパイプを使用する目的は?

APUEから

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

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

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

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

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

  1. FIFOはどのようにして「一連のシェルコマンドで出力ストリームを複製する」のでしょうか。これはteeによって行われていませんか FIFOの代わりに?

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

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

ありがとう。

承認された回答:

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

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

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

    infile → prog1 → tee fifo1 → prog3
    

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

    が必要です。
    infile → prog1 → prog2
                   → prog3
    

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

関連:tmuxの現在のディレクトリに新しいウィンドウを作成するにはどうすればよいですか?
Linux
  1. LinuxコマンドラインからのGoogleドライブの使用

  2. Linux でコマンドラインを使用して任意のファイルをダウンロードするための 4 つのツール

  3. パイプでティーを使用しているときにstderrをファイルに書き込むにはどうすればよいですか?

  1. 複数の接続を使用して wget でファイルをダウンロードする

  2. inode 番号を使用して Linux でファイルを削除する

  3. パイプを使用してvimでファイルを開く方法

  1. コマンドラインを使用してLinuxでtar.gzファイルを抽出する方法

  2. Linuxのコマンドラインを使用してファイルを作成する

  3. 誤って出力リダイレクト > をパイプ | の代わりに使用しました。