Czy dla każdego gniazda jest plik?

21

„Wszystko jest plikiem” w świecie UNIX.

Powyższe zdanie jest znane. Kiedy biegnę echo "hello programmer" >> /dev/tty1, mogę oglądać podany ciąg znaków TeleType 1 ...

Co i gdzie jest plik dla każdego socket? Załóżmy, że mój przyjaciel łączy się z moim komputerem, a jego adresem IP jest h.h.h.h, w jaki sposób mogę uzyskać dostęp do odpowiedniego pliku? Czy to możliwe?

Zatoka Perska
źródło
3
API gniazda jest w rzeczywistości odchyleniem od „polityki uniksowej” pod tym względem, ponieważ pierwotnie pochodzi z BSD . Zauważ, że zawsze istnieje Plan 9 firmy Bell Labs, który jest „bardziej uniksowy niż Unix” - nawet interfejsy sieciowe i graficzne są tam plikami.
ntoskrnl
gniazda i procesy są wymieniane rzetelnie w dokumentach z Planu 9, głównie mówiąc o tym, gdzie zawiódł model UNIX.
strugee

Odpowiedzi:

9

man 7 unix:

Rodzina gniazd AF_UNIX (znana również jako AF_LOCAL) służy do wydajnej komunikacji między procesami na tym samym komputerze. Tradycyjnie gniazda domeny UNIX mogą być nienazwane lub powiązane z nazwą ścieżki do systemu plików (oznaczoną jako gniazdo typu). Linux obsługuje także abstrakcyjną przestrzeń nazw, która jest niezależna od systemu plików.

Tzn. Nie każde gniazdo może być postrzegane jako plik (w znaczeniu „brak pliku bez nazwy pliku”).

Ale są pliki z listami gniazd (np. /proc/net/tcp); nie do końca jednak to, co znaczy „wszystko jest plikiem”.

Hauke ​​Laging
źródło
38

Gniazdo to plik. Ale nie wszystkie pliki mają nazwy. Oto kilka przykładów plików, które nie mają nazw:

  • Każdy plik, który kiedyś miał nazwę i jest teraz usuwany, ale nadal jest otwierany przez program.
  • Anonimowa rur , takich jak jeden tworzony przez |operatora powłoki.
  • Większość gniazd : dowolne gniazdo internetowe lub gniazdo Unix, które nie znajduje się w przestrzeni nazw systemu plików (może znajdować się w abstrakcyjnej przestrzeni nazw lub może być nienazwane).

Pliki, takie jak nienazwane potoki lub gniazda, są tworzone przez proces i mogą być dostępne tylko w tym procesie lub w później utworzonych procesach potomnych. (Nie jest to do końca prawdą: proces, który ma otwarty potok lub gniazdo (lub dowolny inny plik), może przesłać go do innych procesów przez gniazdo Unix; jest to znane jako przekazywanie deskryptora pliku .)

Gniazda o nazwie (system plików lub streszczenie) można otworzyć przy użyciu tej nazwy. Gniazda sieciowe można otwierać (lub dokładniej podłączyć) zdalnie z dowolnego komputera, który ma odpowiednią łączność.

Gilles „SO- przestań być zły”
źródło
To jest poprawna odpowiedź.
jforberg
4
/proc/<pid>/fd/*i /proc/net/*może być interesujące
n611x007,
Proszę przyjąć tę odpowiedź. To jest IMHO o wiele bardziej dokładne.
user1202136,
13

Co i gdzie jest plik dla każdego gniazda?

„Wszystko” to przesada. Nie jest to ścisła polityka, jest to tylko powszechna praktyka korzystania z systemu plików dla interfejsów, ponieważ dostęp do systemu plików jest synonimem wywołań systemowych (tj. System plików jest tak naprawdę interfejsem do jądra, a zatem zapewnia wygodny format dla wszystkich rzeczy) . Inne systemy operacyjne nie wykorzystują tego zbyt często, dlatego jest to uważane za cechę wyróżniającą.

Jak wspomina Hauke ​​Laging, gniazda „unix lokalne” mają węzeł pliku, podobnie jak nazwane potoki (patrz man fifo). Jednak gniazda protokołu internetowego (używane do komunikacji sieciowej) nie. Zamiast tego są one powiązane w przestrzeni użytkownika z numerem portu. Pamiętaj, że gniazdo serwera na jednym porcie łączy wielu klientów z osobnymi gniazdami (jeden plik lokalnego gniazda unix może być również używany w ten sposób z serwerem, co oznacza, że ​​wiele gniazd może być powiązanych z tym samym adresem pliku) w kodzie są one faktycznie indywidualnie identyfikowane za pomocą oddzielnych deskryptorów plików numerycznych .

W tym sensie wszystkie gniazda bardzo podobne do plików i mają link /proc/[pid]/fd/. Możesz nawet wywołać readlink()ten i-węzeł i uzyskać specjalny rodzaj nazwy pliku, który jest używany w narzędziach wiersza poleceń, takich jak lsof, jak sądzę; podobnie można uzyskać informacje o deskryptorze gniazda za pośrednictwem fstat().

Złotowłosa
źródło
Masz na myśli „zidentyfikowane w przestrzeni użytkownika przez ich i-węzeł”? Nie każde gniazdo ma numer portu i może istnieć kilka gniazd dla tego samego numeru portu (nie ma to jednak sensu).
Hauke ​​Laging
@HaukeLaging: Dobra uwaga. Zredagowałem, aby to wyjaśnić, zaczynając od drugiego akapitu.
goldilocks