各ソケットのファイルはありますか?


21

UNIXの世界では「すべてがファイル」です。

上記の文は有名です。実行するecho "hello programmer" >> /dev/tty1TeleType 1 、...で指定された文字列を見ることができます。

各ファイルはどこにありますsocketか?友人が私のPCに接続し、そのIPがh.h.h.hである場合、それぞれのファイルにどのようにアクセスできますか?出来ますか?


3
ソケットAPIは元々BSDから来たため、実際にはこの点で「Unixポリシー」からの逸脱です。Bell Labsの「UnixよりもUnix」であるPlan 9が常に存在することに注意してください。ネットワークAPIとグラフィックスAPIもそこにファイルがあります。
ntoskrnl 14

ソケットとプロセスは、プラン9の論文でかなりの量が言及されており、主にUNIXモデルがどこで失敗したかについて述べています。
14

回答:


9

man 7 unix:

AF_UNIX(AF_LOCALとも呼ばれる)ソケットファミリは、同じマシン上のプロセス間で効率的に通信するために使用されます。従来、UNIXドメインソケットは、名前を付けないか、ファイルシステムパス名(ソケットタイプとしてマークされている)にバインドできます。Linuxは、ファイルシステムに依存しない抽象的な名前空間もサポートしています。

つまり、すべてのソケットがファイルとして認識できるわけではありません(「ファイル名のないファイルがない」という意味です)。

ただし、ソケットのリストを含むファイルがあります(例/proc/net/tcp)。ただし、「すべてがファイル」という意味ではありません。


38

ソケットファイルです。ただし、すべてのファイルに名前があるわけではありません。名前のないファイルの例を次に示します。

  • 以前は名前を持ち、現在は削除されているが、プログラムによって開かれているファイル。
  • シェル演算子によって作成されたものなど、名前のないパイプ|
  • ほとんどのソケット:任意のインターネットソケット、またはファイルシステム名前空間にないUnixソケット(抽象的な名前空間にあるか、名前のない名前)。

名前のないパイプやソケットなどのファイルはプロセスによって作成され、そのプロセスまたはその後に作成された子プロセスでのみアクセスできます。(これは完全に真実ではありません:パイプまたはソケット(または他のファイル)が開いているプロセスは、Unixソケットを介して他のプロセスに送信できます。これはファイル記述子の受け渡しとして知られています。)

名前を持つソケット(ファイルシステムまたは抽象)を、その名前を使用して開くことができます。ネットワークソケットは、適切な接続性を備えた任意のマシンからリモートで開く(またはより正確に接続する)ことができます。


これは正解です。
-jforberg

4
/proc/<pid>/fd/*そして、/proc/net/*面白いかもしれ
n611x007

この回答を受け入れてください。私見のほうがずっと正確です。
user1202136

13

各ソケットごとのファイルはどこにありますか?

「すべて」は誇張です。ファイルシステムへのアクセスはシステムコールと同義であるため、これは厳密なポリシーではなく、インターフェースにファイルシステムを使用する一般的な方法です(つまり、ファイルシステムは実際にはカーネルとのインターフェースであり、あらゆる種類の便利なフォーマットを提供します) 。他のオペレーティングシステムはこれをあまり使用しないため、特徴的な機能と見なされます。

Hauke Lagingが言及しているように、「unix local」ソケットには名前付きパイプと同様にファイルノードがあります(を参照man fifo)。ただし、インターネットプロトコルソケット(ネットワーク通信に使用)はサポートしていません。代わりに、ユーザー空間でポート番号に関連付けられます。単一ポートのサーバーソケットは、それぞれが個別のソケットで複数のクライアントを接続することに注意してください(単一のUNIXローカルソケットファイルをサーバーでこのように使用することもできます。つまり、同じファイルアドレスに関連付けられた複数のソケットがある場合があります)また、コードでは、実際には個別の数値ファイル記述子によって個別に識別されます。

その意味で、すべてのソケットファイルに非常に似ており、にリンクがあり/proc/[pid]/fd/ます。readlink()このiノードを呼び出して、特別な種類のファイル名を取得することもできます。ファイル名は、などのコマンドラインツールで使用されlsofます。同様に、を介してソケット記述子に関する情報を取得できますfstat()


「iノードによってユーザー空間で識別される」という意味ですか?すべてのソケットにポート番号があるわけではなく、同じポート番号に対して複数のソケットが存在する場合があります(ただし、意味がありません)。
ホークレイジング14

@HaukeLaging:良い点。2番目の段落からこのことを明確にするために編集しました。
goldilocks 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.