すべてがファイルです。

すべてがファイルです。

私はBashでパイプ作業をするとき、これについてもう考えていませんでした。しかし、システムコールパイプライン()とフォーク()を使用するいくつかのCコード例を読んで、匿名パイプと名前付きパイプの両方を理解する方法がわかりました。

人々は「Linux/Unixのすべてはファイルだ」という言葉をよく聞いています。パイプが実際にファイルかどうか疑問に思います。接続の一部がパイプファイルに書き込まれ、もう一方がパイプファイルから読み込まれますか?では、匿名パイプのパイプファイルはどこに生成されますか? /tmp、/dev または...?

ただし、名前付きパイプの例では、パイプを使用すると、一時ファイルを明示的に使用するよりも、スペースと時間のパフォーマンスの面で利点があることがわかりました。それはおそらく、パイプの実装にファイルが含まれていないからです。そしてパイプはファイルなどのデータを保存しないようです。だから私はパイプが実際にファイルだと思います。

ベストアンサー1

パフォーマンスの質問に関してはディスクIOが不要なので、パイプはファイルよりも効率的です。したがって、これは本当ではないかもしれませんcmd1 | cmd2(RAMディスクまたは他のメモリデバイスで名前付きパイプでサポートされている場合cmd1 > tmpfile; cmd2 < tmpfile; ただし、名前付きパイプの場合、パイプがいっぱいになると出力がブロックされる可能性があるため、バックグラウンドで実行する必要があります)。結果が必要で、その出力をに送信する必要がある場合は、ディスク読み取りが発生しないようにして並行して実行する必要があります。tmpfilecmd1cmd1cmd2cmd1 | tee tmpfile | cmd2cmd1cmd2cmd2

名前付きパイプは、多くのプロセスが同じパイプを読み書きする場合に便利です。プログラムが使用する必要がある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"

おすすめ記事