
私はLinuxに初めてアクセスし、ファイルシステムを探索している間に「」というフレーズに頻繁に遭遇します。すべてがファイルです「。この質問に対する答えが見えます。ここしかし、私はまだこの概念を理解できません。答えに記載されている内容はまさに「すべてはバイトストリームです」
モニター/キーボードなどが「バイトストリーム」として表示されることが何を意味するのかわかりません。誰かが私がこれを想像するのを助けることができますか?
答え1
「すべてがファイルです」がスローガンと言えます。必要ならミーム。これは完全に正確ではありません。
明らかに、ハードウェアデバイスはhello.txt
ext4ファイルシステムの実際のファイルと同じではありません。それらの多くは記憶装置とは関係がない。
でも全部じゃなくても文書、多くのことが可能です次のアクセス少なくともある程度は文書です。つまり、ファイルシステムツリーに名前があり、システムコールを使用できますread()
。write()
後者は、「すべてがバイトストリームである」という感覚を考慮すると特に重要です。これらの呼び出しはバイトストリームにアクセスするためです。
同じシステムコールが通常のファイル、RAWディスクデバイス、端末、ネットワークソケット、パイプで動作するため、同じツールセットを使用できます。echo foo
たとえば、出力がどこに接続されていても、動作原理は同じです。これにより、ユーティリティの実装を簡素化し、新しい目的に適用するのが簡単になります。シェルまたは他のコマンドラインユーティリティは、パイプまたはソケットを介してSSHサーバーに接続し、ネットワーク経由でSSHサーバーにアクセスするために特別な作業を行う必要はありません。 (対話型セッションの場合でも、SSHは疑似端末を作成するため、ローカルセッションと変わりません。)
さらに、ファイルシステムに多くのものがある場合は、ls
シェルリダイレクト()を使用してそれらを一覧表示してアクセスできます。これは、あまり一般的ではないシステムコールに特別なバイナリを必要とせずに、スクリプトの内外から特殊ファイルにアクセスするのに役立ちます。cat
echo foo > ...
/proc
/sys
まだすべてファイルまたはバイトストリームであるため、およびread()
ですべての操作を実行することはできませんwrite()
。 UDPソケットは固定サイズのマルチバイトデータグラムを送信するため、バイトストリームではありません。 (わずかに異なる処理を行うことはread()
まだ可能です。)一部の操作はまだシステムコールを介して実行する必要があり、ioctl操作はデバイスによって異なります。 Linuxでは、ネットワークデバイスのファイルシステムに名前がありません。write()
ioctl()
たとえば、参照してください。
答え2
UNIX / Linuxシステムのすべては、一種の入力または出力デバイスで視覚化できます。
ディスクは両方を提供します。つまり、ディスクにバイトストリームを書き込むか、ディスクからバイトストリームを読み込みます。キーボードは入力デバイスです。キーボードからバイトストリームを読み込みます。
このバイトストリームの解釈は、現在キーボードを使用しているプログラム(シェル、ユーザープログラム、システムプログラム、または他のプログラム)によって異なります。端末は単にSTDOUTまたはSTDERRに書き込まれたバイトストリームです。
グラフィックコンソールについて話すとき、たとえ話はやや崩れますが、すべての端末ウィンドウで適用されます。端末ウィンドウは、単にシェル/プログラムがバイトを送信するのを待ち、そのバイトをテキストまたは他のASCII文字でユーザーに表示します。
この回答についてのコメントで指摘したように、システムに深く入るにつれて、たとえ話がより細かくなります。 「すべてがファイルである」というオリジナルのフレーズと「すべてがバイトストリームである」という関連フレーズは、システムに初めて触れたり、経験が不足している人がシステムを見やすくするために作成されたようです。経験を積んでLinuxにもっと参加すると、この単純化が時々正しくないことに気付くでしょう。しかし、環境に慣れたばかりの人にはまだ価値があるかもしれません。