Unix では、「すべてがバイト ストリームである」とはどういう意味ですか?

Unix では、「すべてがバイト ストリームである」とはどういう意味ですか?

私はLinux初心者ですが、ファイルシステムを調べていると、「すべてはファイルです「この質問に対する答えは確かにあるここしかし、私はまだその概念を理解できていません。回答では、まさに「すべてはバイトのストリームである

モニターやキーボードなどが「バイトのストリーム」として表現されるという意味がわかりません。これを視覚化するのを手伝ってくれる人はいませんか?

答え1

「すべてはファイルである」というのは、いわばスローガンです。いわばミームです。正確には真実ではありません。

明らかに、ハードウェア デバイスは、ext4 ファイルシステムの場合と同じように実際のファイルではありませんhello.txt。その多くは、ストレージ デバイスとはまったく関係がありません。

しかし、すべてがファイル、多くのことがあたかもそれらは、少なくともある程度はファイルでした。つまり、ファイルシステム ツリー内に名前があり、 およびread()システムwrite()コールをそれらに対して使用できます。後者は、それらの呼び出しがバイト ストリームにアクセスするため、「すべてがバイト ストリームである」という感覚を考慮すると特に重要です。

同じシステム コールが通常のファイル、raw ディスク デバイス、端末、ネットワーク ソケット、パイプで機能するため、それぞれで同じツール セットを使用できます。たとえば、echo foo出力が接続されている場所に関係なく、同じように機能します。これにより、ユーティリティの実装が簡素化され、新しい目的に適用しやすくなります。シェルまたは別のコマンド ライン ユーティリティは、パイプまたはソケットを介して SSH サーバーに接続し、ネットワーク経由でアクセスするために特別な操作を行う必要はありません。(対話型セッションの場合、SSH は疑似端末を作成するため、ローカル セッションとそれほど違いはありません。)

また、ファイルシステム内に複数のものが存在する場合、それらをおよびシェル リダイレクト ( ) を使用して一覧表示しls、それらにアクセスできます。これは、あまり一般的ではないシステム コールを実行するために特別なバイナリを必要とせずに、スクリプト内またはスクリプトから特別なファイルにアクセスする場合に便利です。catecho foo > .../proc/sys

まだありませんすべてread()はファイル、またはバイト ストリームですが、これらについては、とですべてを実行できるわけではありませんwrite()。UDP ソケットはバイト ストリームではなく、固定サイズのマルチバイト データグラムを転送します。(ただしread()write()と は、少し異なる方法でそれらでも動作します。) 一部のアクションは、依然としてioctl()システム コールで実行する必要があり、ioctl 操作はデバイス固有です。Linux では、ネットワーク デバイスはファイル システム内に名前を持っていません。

以下も参照

答え2

UNIX / Linux システム内のすべては、何らかの入力デバイスまたは出力デバイスとして視覚化できます。

ディスクは、バイト ストリームを書き込むか、またはディスクからバイト ストリームを読み取るかのどちらかです。キーボードは入力デバイスであり、キーボードからバイト ストリームを読み取ります。

このバイト ストリームの解釈は、現在キーボードを使用しているプログラム (シェル、ユーザー プログラム、システム プログラムなど) によって決まります。ターミナルは、単に STDOUT または STDERR に書き込まれるバイト ストリームです。

グラフィカル コンソールについて話す場合、この類推は多少崩れますが、各ターミナル ウィンドウ内では当てはまります。ターミナル ウィンドウは、シェル/プログラムによってバイトが送信されるのを待機し、そのバイトをテキストまたはその他の ASCII 文字の形式でユーザーに表示するだけのものです。

この回答へのコメントで指摘されているように、システムを深く理解するにつれて、この類推はさらに崩れていきます。最初のフレーズ「すべてはファイルである」と関連するフレーズ「すべてはバイトのストリームである」は、システムを初めて使用する人や経験の少ない人のために、システムの見方を単純化するために作られたようです。経験を積み、Linux に深く関わるようになると、この単純化が間違っている場合があることに気付くでしょうが、環境に慣れ始めたばかりの人にとっては依然として価値があります。

関連情報