「すべてがファイル」はUnixの主要な概念の1つであることを理解していますが、ソケットはカーネルによって提供されるさまざまなAPI(ソケット、sendto、recvなど)を使用し、通常のファイルシステムインターフェイスとは異なります。
この「すべてがファイル」は、ここでどのように適用されますか?
「すべてがファイル」はUnixの主要な概念の1つであることを理解していますが、ソケットはカーネルによって提供されるさまざまなAPI(ソケット、sendto、recvなど)を使用し、通常のファイルシステムインターフェイスとは異なります。
この「すべてがファイル」は、ここでどのように適用されますか?
回答:
ソケットは異なるAPIを使用します
それは完全に真実ではありません。ソケットで使用するための追加機能がいくつかありますが、たとえば、通常read()
およびwrite()
ソケットfdで使用できます。
この「すべてがファイル」は、ここでどのように適用されますか?
ファイル記述子が関係しているという意味で。
「ファイル」の定義がファイルシステムに保存されているバイトの離散シーケンスである場合、すべてがファイルであるとは限りません。ただし、ファイルの定義が、情報の導管、つまりI / O接続などのように処理される場合、「すべてがファイル」がより意味を持ち始めます。これらのことは必然的にバイトのシーケンスを伴いますが、それらがどこから来るか、どこへ行くかは文脈によって異なる場合があります。
ただし、実際には文字通りの意図ではありません。デーモンはデーモンはプロセスであり、ファイルではありません。ただし、IPCを実行している場合、別のプロセスに関連する方法は、ファイルスタイルのエンティティによって緩和される可能性があります。
「すべてはファイルです」は単なる誇張です。それはだった 1970年代に小説、それはだった UNIXの主な際立った特徴。しかし、それは明らかにマーケティングの概念であり、UNIXの本当の基盤ではありません。それは明らかに真実ではないからです。すべてをファイルとして扱うことは有益でも賢明でもありません。
CPUはファイルですか?あなたのプログラムは新しい命令を取得するためにCPUを読み込みますか?RAMはファイルですか?あなたのプログラムは次のバイトを読みますか?
当時、フロッピーディスク用の1つのAPIと、ハードディスク用の異なるAPI、磁気テープ用の異なるAPI、異なる端末用の異なるAPIなどを提供するOSがありました。IBMメインフレームシステムには、ハードディスク上にさまざまな種類のファイルがあり、信じられないかもしれませんが、それぞれに異なるAPIを提供しました。したがって、UNIXの「それはファイル」アプローチと「stdin / stdout / stderr」アプローチは、ユーザーとプログラマの両方に非常にエレガントな抽象化をもたらしました。
ネットワークでは、この特定の抽象化はうまくいきませんでした。そして、害はありません。OSの全体的なエレガンスと一貫性がわずかに低下します。しかし、それは機能します。/dev/myinternetz/www/google/com/tcp/80
今日、システムのどこかに呼び出されるファイルがありますか?あなたはそれをopen()し、クエリを書き、そしてその答えを素敵なHTMLでread()できますか いや?これは、この「ファイルである」抽象化が、ネットワークを介したやり取りにはあまり便利ではなかったためです。実際にはあまりうまく機能しません。動作中の漏れやすい抽象化の法則。
/dev/tcp/www.google.com/80
。ただし、実際のファイルではありません。bashは単なる偽物です。
/dev/mem
か/dev/kmem
、あなたが望むなら。
ソケットはファイルです。あなたは使用することができますread
し、write
ソケット上:彼らが呼び出すのと同じだrecv
とsend
とflags=0
。でそれらを閉じますclose
。dup
ファイル記述子をシャッフルする必要がある場合は、友達と一緒に移動できます。でいくつかのフラグを設定しfcntl
、を呼び出しfdopen
た後にstdioバッファリングを使用できます。リストは続きます。非常に重要なのは、あなたが呼び出すことができますselect
し、poll
これらの機能は、それがファイル記述子を一覧表示するだけで任意の手段を介して入力を受け取るまでのプログラムをブロックすることができますので、ソケットを含め、ファイルのいずれかのタイプに。
いくつかのソケットタイプ(のための余分なシステムコールがありますrecv
とsend
、shutdown
デバイスのための余分なシステムコールが(そこにあるように、など)が、ioctl
)。
すべてのファイルに名前が付いているわけではありません。名前が付いているものは、ディレクトリ構造に常に存在するとは限りません。パイプにより作成されたpipe
(例えば、シェルのパイプラインで)とによって作成されたソケットはsocketpair
名前を持っていないが、彼らはまだファイルです。によって作成されたソケットsocket
は、その構文がドメインに依存する名前を持っています。この名前は、struct sockaddr
to bind
および他の関数で渡されます。Unix(AF_UNIX
)ソケットの場合、名前はでありstruct sockaddr_un
、これはファミリーおよびストリングです。文字列に応じて、これはファイル名(mknod
多くのUNIXバリアントで名前付きソケットを作成できる)またはそうでない(抽象名前空間)のいずれかになります。IPv4(AF_INET
)ソケットの場合、名前はでstruct sockaddr_in
、ポート番号とIPアドレスに加えてprotocol
、socket
呼び出しからの名前が含まれます。
stat
ソケットの場合、iノード番号と通常のファイルのその他の特性があることがわかります。そのため、ファイルシステム上のファイルとして分類します。例:
# file live
live: socket
# stat live
File: `live'
Size: 0 Blocks: 0 IO Block: 4096 socket
Device: fc03h/64515d Inode: 198817 Links: 1
Access: (0660/srw-rw----) Uid: (23129/ icinga) Gid: (23130/icinga-cmd)
Access: 2014-11-07 09:27:59.000000000 -0800
Modify: 2014-11-05 09:27:03.000000000 -0800
Change: 2014-11-05 09:27:03.000000000 -0800
11/17。Linux(ext3)の追加情報:ソケットにはiノード(ディスク上の256バイトブロック)がありますが、データブロックはありません(iノードを抽出し、データブロックポインターを調べることでこれを確認できます)。 0のブロックカウントを示すdebugfs 'stat'を実行します。そのため、ファイルメタデータ(所有者、グループ、権限など)はありますが、ディスク上のデータコンテンツはありません。これはtouch /tmp/foo
、ブロックカウントが0の通常の空のファイル()と同じです。最初のケースでは、iノードの「タイプ」フィールドに「ソケット」が表示されます。2番目のケースでは、「通常のファイル」と表示されます。
参照:ext2 iノード構造。stat
、dumpe2fs
、およびdebugfs
コマンド。
file
かstat
なり、それファイル上を。