特定のプログラム(たとえばfoo)は、ファイルにのみ、出力をstdoutに書き込むことができません。 ファイル名としての「-」でさえ、「-」という名前のファイルを作成します[Unixのほとんどのスマートプログラムは、ファイル名の代わりに単一のマイナスがstdoutへの出力を意味することを知っています]。 同様に、/ dev / stdoutを拒否します。
最初のバーの結果を処理する別のプログラムは、標準入力から読み取り、標準出力に書き込みます。 (正確には、1つ目はバイナリダンプを提供する特別な種類のトレーサーであり、2つ目は人間が読める形式でそれらを出力するコンバーターです)。
それらをコンベアに結合する必要があります。
いオプションは、通常のファイルを使用することです。 私はそれを書き留めて読んだ。
より美しいオプションがあります-これらは名前付きパイプです。 パイプには名前があるため、最初のプログラムにファイルとして転送してから、コンテンツを別のプログラムに転送できます。
次のようになります。
mkfifo mypipe 猫マイパイプ| バー& foo mypipe& rmマイパイプ
ファイルシステムのパイプは次のようになります。
ls -l mypipe prw-r-r-- 1 root root 0 May 24 12:23 mypipe
(最初の文字として文字「p」を強調)。
どのように機能しますか? 実際、fifo別名名前付きパイプは「通常のパイプ」であり、「|」スティックでエンコードされたもののようなものです。 ただし、NAMEがあり、この名前はファイルが必要な場所であればどこでも指定できます。
名前付きパイプに書き込むプログラムは、ファイルのように動作します。 つまり 自分に書き込み、書き込みます。 読み取るプログラムも同様です。 自分に読んで読んでいます。 読み取りは、記録が行われた順に行われます(FIFO-先入れ先出し)。 パイプに関する規定(左/右)は、誰が読み書きするかによって決まります。
パイプの重要な機能は、バッファーが空/満杯の場合に読み取り/きしみプログラムを遅くする機能です。
読書の例を考えてみましょう。 プログラムは、パイプに1秒あたり1行を書き込みます。 リーダープログラムは、可能な限り高速で読み取ります。 プログラムは、バッファにあったすべてを「読み取り」、次のリクエストを送信します。 カーネルは、データが表示されるまでこの要求を遅らせます。 したがって、同期を心配する必要はありません。データが表示され、ハンドラープログラムがread()から制御を戻し、次のデータバッチを処理します。