Unixインターネットソケットファイルはありますか?


23

「すべてがファイル」はUnixの主要な概念の1つであることを理解していますが、ソケットはカーネルによって提供されるさまざまなAPI(ソケット、sendto、recvなど)を使用し、通常のファイルシステムインターフェイスとは異なります。

この「すべてがファイル」は、ここでどのように適用されますか?

回答:


26

ソケットは異なるAPIを使用します

それは完全に真実ではありません。ソケットで使用するための追加機能がいくつかありますが、たとえば、通常read()およびwrite()ソケットfdで使用できます。

この「すべてがファイル」は、ここでどのように適用されますか?

ファイル記述子が関係しているという意味で。

「ファイル」の定義がファイルシステムに保存されているバイトの離散シーケンスである場合、すべてがファイルであるとは限りません。ただし、ファイルの定義が、情報の導管、つまりI / O接続などのように処理される場合、「すべてがファイル」がより意味を持ち始めます。これらのことは必然的にバイトのシーケンスを伴いますが、それらがどこから来るか、どこへ行くかは文脈によって異なる場合があります。

ただし、実際には文字通りの意図ではありません。デーモンはデーモンはプロセスであり、ファイルではありません。ただし、IPCを実行している場合、別のプロセスに関連する方法は、ファイルスタイルのエンティティによって緩和される可能性があります。


5
「すべてがファイルである」という正確な言い直しは、「すべてのインターフェースはファイルを介して行われる」べきだと思います。ファイル(stdin / out / err、/ proc / $ pidなど)を介してプロセスと対話します。ファイル(ソケット/ファイル記述子)を介してネットワークと対話します。ファイル(/ dev / mouse)を介してマウスと対話します。
パトリック14年

/ procから開いてソケットハンドルを複製したことがあります。
ジョシュア14年

12

「すべてはファイルです」は単なる誇張です。それはだった 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()できますか いや?これは、この「ファイルである」抽象化が、ネットワークを介したやり取りにはあまり便利ではなかったためです。実際にはあまりうまく機能しません。動作中の漏れやすい抽象化の法則


9
楽しい事実:bashの一部のバージョンでは、を開くことができます/dev/tcp/www.google.com/80。ただし、実際のファイルではありません。bashは単なる偽物です。
user253751 14年

2
@immibs:もっと重要なことは、実際にそれを実装するファイルシステムを作成することは合理的に可能です。
ジョシュア14年

私はあなたが読むことができる/dev/mem/dev/kmem、あなたが望むなら。
ジェイソンC 14年

4
プラン9ではこれをさらに進めており、実際、ネットワークプロトコルは擬似ファイルシステムを介して/ dev / myinternetz / www / google / com / tcp / 80の例の効果に対応していることに注意してください(もちろんパスは異なります)。さらに、物理RAMは実際にはファイルのように機能し、ファイルをmmapするのと同じように、ramを仮想アドレス空間にmmapします。(mallocはこの考えに基づいて実装されています)。
バリティ14年

1
「すべてがファイルである」ことを極限までとる計画9に加えて、「すべてがネットワークに透過的である」ことには、かなり強力な意味があります。たとえば、NATの必要はありません。ルーターのTCP / IPスタック(ネットワーク透過ファイル(システム)のみ)をローカルマシンにマウントし、ルーターから直接パケットを送信できます。
ヨルグWミットタグ14年

7

ソケットはファイルです。あなたは使用することができますreadし、writeソケット上:彼らが呼び出すのと同じだrecvsendflags=0。でそれらを閉じますclosedupファイル記述子をシャッフルする必要がある場合は、友達と一緒に移動できます。でいくつかのフラグを設定しfcntl、を呼び出しfdopenた後にstdioバッファリングを使用できます。リストは続きます。非常に重要なのは、あなたが呼び出すことができますselectし、pollこれらの機能は、それがファイル記述子を一覧表示するだけで任意の手段を介して入力を受け取るまでのプログラムをブロックすることができますので、ソケットを含め、ファイルのいずれかのタイプに。

いくつかのソケットタイプ(のための余分なシステムコールがありますrecvsendshutdownデバイスのための余分なシステムコールが(そこにあるように、など)が、ioctl)。

すべてのファイルに名前付いいるわけではありません。名前付いいるものは、ディレクトリ構造に常に存在するとは限りません。パイプにより作成されたpipe(例えば、シェルのパイプラインで)とによって作成されたソケットはsocketpair名前を持っていないが、彼らはまだファイルです。によって作成されたソケットsocketは、その構文がドメインに依存する名前を持っています。この名前は、struct sockaddrto bindおよび他の関数で渡されます。Unix(AF_UNIX)ソケットの場合、名前はでありstruct sockaddr_un、これはファミリーおよびストリングです。文字列に応じて、これはファイル名(mknod多くのUNIXバリアントで名前付きソケットを作成できる)またはそうでない(抽象名前空間)のいずれかになります。IPv4(AF_INET)ソケットの場合、名前はでstruct sockaddr_in、ポート番号とIPアドレスに加えてprotocolsocket呼び出しからの名前が含まれます。


7

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ノード構造statdumpe2fs、およびdebugfsコマンド。


1
私はちょうど実行するために何かあると言うだろうfilestatなり、それファイル上を。
ケビン14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.