Unixの名前付きパイプ

Unixの基礎を勉強しているときでさえ、私は長い間それらについて読みましたが、どういうわけかそれらを扱う必要はありませんでした。 そして、必要が生じました。



特定のプログラム(たとえば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()から制御を戻し、次のデータバッチを処理します。



All Articles