パフォーマンスの質問については、ディスクIOが必要ないため、パイプはファイルよりも効率的です。したがってcmd1 | cmd2
、より効率的ですcmd1 > tmpfile; cmd2 < tmpfile
(tmpfile
名前付きパイプとしてRAMディスクまたは他のメモリデバイスにバックアップされている場合、これは当てはまらない可能性がありますが、名前付きパイプのcmd1
場合、パイプがいっぱいになると出力がブロックされる可能性があるため、バックグラウンドで実行する必要があります)。の結果が必要であり、cmd1
まだ出力を送信cmd2
する必要がcmd1 | tee tmpfile | cmd2
ある場合は、からのディスク読み取り操作を回避して、並列で実行cmd1
およびcmd2
実行できるようにする必要がありますcmd2
。
名前付きパイプは、多くのプロセスが同じパイプに対して読み取り/書き込みを行う場合に役立ちます。また、ファイルを使用する必要があるIOにstdin / stdoutを使用するようにプログラムが設計されていない場合にも役立ちます。名前付きパイプは、メモリに常駐し、ファイルシステムエントリ(参照目的)がある場合でも、固定バッファサイズを持っているため、ストレージの観点では正確にファイルではないため、ファイルを斜体にします。その他のもの UNIXでファイルされることなく、ファイルシステムのエントリを持っている:だけを考え/dev/null
たり、他のエントリに/dev
か/proc
。
パイプ(名前付きおよび名前なし)のバッファサイズは固定されているため、それらに対する読み取り/書き込み操作がブロックされ、読み取り/書き込みプロセスがIOWait状態になります。また、メモリバッファから読み取るときにEOFを受信するのはいつですか?この動作に関するルールは明確に定義されており、男性に記載されています。
パイプ(名前付きおよび名前なし)でできないことの1つは、データをシークバックすることです。メモリバッファを使用して実装されているため、これは理解できます。
について"everything in Linux/Unix is a file"
、私は同意しません。名前付きパイプにはファイルシステムエントリがありますが、正確にはファイルではありません。名前のないパイプにはファイルシステムエントリがありません(多分を除く/proc
)。ただし、UNIXでのほとんどのIO操作は、名前なしパイプ(およびソケット)を含むファイル記述子を必要とする読み取り/書き込み機能を使用して行われます。私たちはそう言うことができるとは思いません"everything in Linux/Unix is a file"
が、確かにそう言うことができ"most IO in Linux/Unix is done using a file descriptor"
ます。