„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?
Odpowiedzi:
man 7 unix:
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”.źródło
Gniazdo to plik. Ale nie wszystkie pliki mają nazwy. Oto kilka przykładów plików, które nie mają nazw:
|
operatora powłoki.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ść.
źródło
/proc/<pid>/fd/*
i/proc/net/*
może być interesujące„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 są 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 jaklsof
, jak sądzę; podobnie można uzyskać informacje o deskryptorze gniazda za pośrednictwemfstat()
.źródło