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


21

"Все - файл" у світі UNIX.

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

Що і де файл у кожному socket? Припустимо, мій друг підключається до мого ПК, і його IP - це h.h.h.h, як я можу отримати доступ до відповідного файлу? Це можливо?


3
API сокета насправді є відхиленням від "політики Unix" в цьому плані, оскільки він спочатку походить від BSD . Зауважте, що завжди існує план 9 від Bell Labs, який "більше Unix, ніж Unix" - навіть мережеві та графічні API є файлами.
ntoskrnl

у документах План 9 згадується досить багато розеток та процесів, в основному йдеться про те, де модель UNIX пішла не так.
strugee

Відповіді:


9

людина 7 unix:

Родина сокетів AF_UNIX (також відома як AF_LOCAL) використовується для ефективної комунікації між процесами на одній машині. Традиційно сокети домену UNIX можуть бути або безіменними, або прив’язаними до імені файлової системи (позначено як тип сокета). Linux також підтримує абстрактний простір імен, який не залежить від файлової системи.

Тобто не кожен сокет може розглядатися як файл (у значенні "немає файлу без імені файлу").

Але є файли зі списками розеток (наприклад /proc/net/tcp); не зовсім те, що означає "все - файл".


38

Сокет - це файл. Але не всі файли мають імена. Ось кілька прикладів файлів, які не мають імен:

  • Будь-який файл, який раніше мав ім’я, тепер видаляється, але все ще відкривається програмою.
  • Безіменна труба , така як створена |оператором оболонки.
  • Більшість сокетів : будь-який сокет Інтернет або сокет Unix, який відсутній у просторі імен файлової системи (він може бути в абстрактному просторі імен або без назви).

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

Сокети, які мають ім’я (у файловій системі чи абстрактно), можна відкрити за допомогою цього імені. Мережеві розетки можна відкривати (або точніше підключити до них) віддалено з будь-якої машини, яка має відповідне підключення.


Це правильна відповідь.
jforberg

4
/proc/<pid>/fd/*і /proc/net/*може бути цікаво
n611x007

Прийміть цю відповідь. Це ІМХО набагато точніше.
користувач1202136

13

Що і де файл у кожному сокеті?

"Все" - це перебільшення. Це не сувора політика, це просто звичайна практика використання файлової системи для інтерфейсів, оскільки доступ до файлової системи є синонімом системних викликів (тобто файлова система справді є інтерфейсом з ядром, і тому забезпечує зручний формат для всіляких речей) . Інші операційні системи не користуються цим сильно, тому це вважається відмінною рисою.

Як згадує Hauke ​​Laging, "unix local" розетки мають вузол файлу, як і названі труби (див. man fifo). Однак розетки протоколу Інтернету (використовуються для мережевого зв'язку) цього не роблять. Натомість вони асоціюються в просторі користувачів з номером порту. Зауважте, що серверний сокет на одному порту з'єднує декілька клієнтів, кожен з яких має власний індивідуальний сокет (один файл локального сокета unix також може бути використаний таким чином із сервером, тобто може бути декілька сокетів, пов'язаних з однією адресою файлу) а в коді вони насправді ідентифікуються індивідуально через окремі дескриптори файлів чисел .

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


Ви маєте на увазі "ідентифікований у користувальницькій області за їхнім inode"? Не кожен сокет має номер порту, і для одного і того ж номера порту може бути декілька розеток (однак це не має сенсу).
Hauke ​​Laging

@HaukeLaging: Добре. Я відредагував це, щоб зробити це зрозумілішим, починаючи з другого абзацу.
goldilocks
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.