UNIXの世界では「すべてがファイルです」。
上記の文は有名です。 echo "hello programmer" >> /dev/tty1
を実行すると、TeleType 1
で指定された文字列を監視できます。
各socket
ごとのファイルはどこにありますか?私の友人が私のPCに接続し、そのIPがh.h.h.h
であるとすると、それぞれのファイルにどのようにアクセスできますか?出来ますか?
man 7 unix:
AF_UNIX(AF_LOCALとも呼ばれる)ソケットファミリは、同じマシン上のプロセス間で効率的に通信するために使用されます。従来、UNIXドメインソケットは、名前を付けないか、ファイルシステムのパス名(ソケットタイプとしてマークされている)にバインドできます。 Linuxは、ファイルシステムに依存しない抽象名前空間もサポートしています。
つまりすべてのソケットがファイルとして認識されるわけではありません(「ファイル名のないファイルがない」という意味です)。
しかし、ソケットのリストを含むファイルがあります(例:/proc/net/tcp
);ただし、「すべてがファイルである」という意味ではありません。
ソケットはファイルです。ただし、すべてのファイルに名前があるわけではありません。次に、名前のないファイルの例をいくつか示します。
|
シェルオペレーターによって作成されたもの。名前のないパイプやソケットなどのファイルはプロセスによって作成され、そのプロセスまたは後で作成される子プロセスでのみアクセスできます。 (これは完全に真実ではありません:パイプまたはソケット(または他のファイル)を開いているプロセスは、Unixソケットを介して他のプロセスに送信できます。これは ファイル記述子の受け渡し と呼ばれます。)
名前が付いているソケット(ファイルシステムまたはアブストラクト)は、その名前を使用して開くことができます。ネットワークソケットは、適切な接続を持つマシンからリモートで開く(またはより正確に接続する)ことができます。
各ソケットごとのファイルはどこにありますか?
「すべて」は誇張です。これは厳密なポリシーではありません。ファイルシステムへのアクセスはシステムコールと同義であるため、ファイルシステムをインターフェイスに使用するのは単なる一般的な方法です(つまり、ファイルシステムは実際にはカーネルとのインターフェイスであり、あらゆる種類のものに便利な形式を提供します)。 。他のオペレーティングシステムではこれをあまり使用しないため、特徴的な機能と見なされます。
Hauke Lagingが述べているように、 "unix local"ソケット には名前付きパイプと同様にファイルノードがあります(_man fifo
_を参照)。ただし、インターネットプロトコルソケット(ネットワーク通信に使用)はそうではありません。代わりに、ユーザー空間でポート番号に関連付けられます。単一ポートのサーバーソケットが複数のクライアントをそれぞれ独自のソケットに接続することに注意してください(単一のUNIXローカルソケットファイルをサーバーでこのように使用することもできます。つまり、同じファイルアドレスに複数のソケットが関連付けられている場合があります)。そしてコードでは、実際には個別の数値ファイル記述子によって個別に識別されます。
したがって、その意味では、すべてのソケットはファイルによく似ており、リンクは_/proc/[pid]/fd/
_にあります。このiノードでreadlink()
を呼び出して、lsof
などのコマンドラインツールで使用される特別な種類のファイル名を取得することもできます。同様に、fstat()
を介してソケット記述子に関する情報を取得できます。