UNIXの世界では「すべてがファイル」です。
上記の文は有名です。実行するecho "hello programmer" >> /dev/tty1
とTeleType 1
、...で指定された文字列を見ることができます。
各ファイルはどこにありますsocket
か?友人が私のPCに接続し、そのIPがh.h.h.h
である場合、それぞれのファイルにどのようにアクセスできますか?出来ますか?
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ソケットを介して他のプロセスに送信できます。これはファイル記述子の受け渡しとして知られています。)
名前を持つソケット(ファイルシステムまたは抽象)を、その名前を使用して開くことができます。ネットワークソケットは、適切な接続性を備えた任意のマシンからリモートで開く(またはより正確に接続する)ことができます。
/proc/<pid>/fd/*
そして、/proc/net/*
面白いかもしれ
各ソケットごとのファイルはどこにありますか?
「すべて」は誇張です。ファイルシステムへのアクセスはシステムコールと同義であるため、これは厳密なポリシーではなく、インターフェースにファイルシステムを使用する一般的な方法です(つまり、ファイルシステムは実際にはカーネルとのインターフェースであり、あらゆる種類の便利なフォーマットを提供します) 。他のオペレーティングシステムはこれをあまり使用しないため、特徴的な機能と見なされます。
Hauke Lagingが言及しているように、「unix local」ソケットには名前付きパイプと同様にファイルノードがあります(を参照man fifo
)。ただし、インターネットプロトコルソケット(ネットワーク通信に使用)はサポートしていません。代わりに、ユーザー空間でポート番号に関連付けられます。単一ポートのサーバーソケットは、それぞれが個別のソケットで複数のクライアントを接続することに注意してください(単一のUNIXローカルソケットファイルをサーバーでこのように使用することもできます。つまり、同じファイルアドレスに関連付けられた複数のソケットがある場合があります)また、コードでは、実際には個別の数値ファイル記述子によって個別に識別されます。
その意味で、すべてのソケットはファイルに非常に似ており、にリンクがあり/proc/[pid]/fd/
ます。readlink()
このiノードを呼び出して、特別な種類のファイル名を取得することもできます。ファイル名は、などのコマンドラインツールで使用されlsof
ます。同様に、を介してソケット記述子に関する情報を取得できますfstat()
。