私は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()
たとえば、参照してください。