Есть ли файл для каждого сокета?

21

«Все это файл» в мире UNIX.

Выше предложение известно. Когда я бегу echo "hello programmer" >> /dev/tty1, я могу посмотреть на заданную строку TeleType 1 , ....

Что и где файл для каждого socket? Предположим, что мой друг подключается к моему компьютеру, и его IP-адрес h.h.h.h, как я могу получить доступ к соответствующему файлу? Является ли это возможным?

Персидский залив
источник
3
API сокетов на самом деле является отклонением от «политики Unix» в этом отношении, потому что он изначально пришел из BSD . Обратите внимание, что всегда есть Plan 9 от Bell Labs, которая «больше Unix, чем Unix» - даже сетевые и графические API-интерфейсы являются файлами там.
ntoskrnl
сокеты и процессы упоминаются в значительных количествах в статьях Plan 9, в основном о том, где модель UNIX пошла не так.
стружка

Ответы:

9

человек 7 unix:

Семейство сокетов AF_UNIX (также известное как AF_LOCAL) используется для эффективного взаимодействия между процессами на одном компьютере. Традиционно, доменные сокеты UNIX могут быть либо безымянными, либо привязаны к пути к файловой системе (помечены как имеющие тип сокета). Linux также поддерживает абстрактное пространство имен, которое не зависит от файловой системы.

Т.е. не каждый сокет можно рассматривать как файл (в смысле «нет файла без имени файла»).

Но есть файлы со списками сокетов (например /proc/net/tcp); не совсем то, что означает "все - файл".

Хауке Лагинг
источник
38

Гнездо представляет собой файл. Но не все файлы имеют имена. Вот несколько примеров файлов, которые не имеют имен:

  • Любой файл, который имел имя и теперь удален, но все еще открывается программой.
  • Неназванная труба , такие как один , созданный |оператор оболочки.
  • Большинство сокетов : любой интернет-сокет или Unix-сокет, который не находится в пространстве имен файловой системы (это может быть в абстрактном пространстве имен или без имени).

Файлы, такие как безымянные каналы или сокеты, создаются процессом и могут быть доступны только в этом процессе или в впоследствии созданных дочерних процессах. (Это не совсем так: процесс, у которого открыт канал или сокет (или любой другой файл), может передавать его другим процессам через сокет Unix; это называется передачей дескриптора файла .)

Сокеты с именем (в файловой системе или абстрактном) могут быть открыты с использованием этого имени. Сетевые сокеты могут быть открыты (или более точно подключены) удаленно с любого компьютера, который имеет соответствующие возможности подключения.

Жиль "ТАК - перестань быть злым"
источник
Это правильный ответ.
Jforberg
4
/proc/<pid>/fd/*и /proc/net/*может быть интересно
n611x007
Пожалуйста, примите этот ответ. ИМХО намного точнее.
user1202136 23.09.16
13

Что и где находится файл для каждого сокета?

«Все» - это преувеличение. Это не строгая политика, это просто обычная практика использования файловой системы для интерфейсов, поскольку доступ к файловой системе является синонимом системных вызовов (т. Е. Файловая система на самом деле является интерфейсом с ядром, и поэтому предоставляет удобный формат для всех видов вещей). , Другие операционные системы не так широко используют это, поэтому это считается отличительной чертой.

Как упоминает Hauke ​​Laging, «локальные unix-сокеты» имеют файловый узел, как и именованные каналы (см. man fifo). Однако сокеты интернет-протокола (используемые для связи по сети) этого не делают. Вместо этого они ассоциируются в пространстве пользователя с номером порта. Обратите внимание, что серверный сокет на одном порту соединяет несколько клиентов, каждый из которых имеет собственный индивидуальный сокет (таким же образом можно использовать один локальный файл локальных сокетов unix с сервером, то есть может быть несколько сокетов, связанных с одним и тем же адресом файла). и в коде они фактически идентифицируются индивидуально через отдельные числовые дескрипторы файлов.

Таким образом, в этом смысле все сокеты являются так же, как файлы, и есть ссылка в /proc/[pid]/fd/. Вы даже можете вызвать readlink()этот индекс и получить специальный вид имени файла, который используется в инструментах командной строки, таких как lsof, я считаю; также вы можете получить информацию о дескрипторе сокета через fstat().

лютик золотистый
источник
Вы имеете в виду "идентифицированные в пространстве пользователя по их индоду"? Не каждый сокет имеет номер порта, и может быть несколько сокетов для одного и того же номера порта (хотя это не имеет смысла).
Хауке Лагинг
@HaukeLaging: Хороший вопрос. Я отредактировал, чтобы сделать это более понятным, начиная со второго абзаца.
Златовласка