Что и где находится файл для каждого сокета?
«Все» - это преувеличение. Это не строгая политика, это просто обычная практика использования файловой системы для интерфейсов, поскольку доступ к файловой системе является синонимом системных вызовов (т. Е. Файловая система на самом деле является интерфейсом с ядром, и поэтому предоставляет удобный формат для всех видов вещей). , Другие операционные системы не так широко используют это, поэтому это считается отличительной чертой.
Как упоминает Hauke Laging, «локальные unix-сокеты» имеют файловый узел, как и именованные каналы (см. man fifo
). Однако сокеты интернет-протокола (используемые для связи по сети) этого не делают. Вместо этого они ассоциируются в пространстве пользователя с номером порта. Обратите внимание, что серверный сокет на одном порту соединяет несколько клиентов, каждый из которых имеет собственный индивидуальный сокет (таким же образом можно использовать один локальный файл локальных сокетов unix с сервером, то есть может быть несколько сокетов, связанных с одним и тем же адресом файла). и в коде они фактически идентифицируются индивидуально через отдельные числовые дескрипторы файлов.
Таким образом, в этом смысле все сокеты являются так же, как файлы, и есть ссылка в /proc/[pid]/fd/
. Вы даже можете вызвать readlink()
этот индекс и получить специальный вид имени файла, который используется в инструментах командной строки, таких как lsof
, я считаю; также вы можете получить информацию о дескрипторе сокета через fstat()
.