«Все это файл» в мире UNIX.
Выше предложение известно. Когда я бегу echo "hello programmer" >> /dev/tty1
, я могу посмотреть на заданную строку TeleType 1
, ....
Что и где файл для каждого socket
? Предположим, что мой друг подключается к моему компьютеру, и его IP-адрес h.h.h.h
, как я могу получить доступ к соответствующему файлу? Является ли это возможным?
Ответы:
человек 7 unix:
Т.е. не каждый сокет можно рассматривать как файл (в смысле «нет файла без имени файла»).
Но есть файлы со списками сокетов (например
/proc/net/tcp
); не совсем то, что означает "все - файл".источник
Гнездо представляет собой файл. Но не все файлы имеют имена. Вот несколько примеров файлов, которые не имеют имен:
|
оператор оболочки.Файлы, такие как безымянные каналы или сокеты, создаются процессом и могут быть доступны только в этом процессе или в впоследствии созданных дочерних процессах. (Это не совсем так: процесс, у которого открыт канал или сокет (или любой другой файл), может передавать его другим процессам через сокет Unix; это называется передачей дескриптора файла .)
Сокеты с именем (в файловой системе или абстрактном) могут быть открыты с использованием этого имени. Сетевые сокеты могут быть открыты (или более точно подключены) удаленно с любого компьютера, который имеет соответствующие возможности подключения.
источник
/proc/<pid>/fd/*
и/proc/net/*
может быть интересно«Все» - это преувеличение. Это не строгая политика, это просто обычная практика использования файловой системы для интерфейсов, поскольку доступ к файловой системе является синонимом системных вызовов (т. Е. Файловая система на самом деле является интерфейсом с ядром, и поэтому предоставляет удобный формат для всех видов вещей). , Другие операционные системы не так широко используют это, поэтому это считается отличительной чертой.
Как упоминает Hauke Laging, «локальные unix-сокеты» имеют файловый узел, как и именованные каналы (см.
man fifo
). Однако сокеты интернет-протокола (используемые для связи по сети) этого не делают. Вместо этого они ассоциируются в пространстве пользователя с номером порта. Обратите внимание, что серверный сокет на одном порту соединяет несколько клиентов, каждый из которых имеет собственный индивидуальный сокет (таким же образом можно использовать один локальный файл локальных сокетов unix с сервером, то есть может быть несколько сокетов, связанных с одним и тем же адресом файла). и в коде они фактически идентифицируются индивидуально через отдельные числовые дескрипторы файлов.Таким образом, в этом смысле все сокеты являются так же, как файлы, и есть ссылка в
/proc/[pid]/fd/
. Вы даже можете вызватьreadlink()
этот индекс и получить специальный вид имени файла, который используется в инструментах командной строки, таких какlsof
, я считаю; также вы можете получить информацию о дескрипторе сокета черезfstat()
.источник