Powodem dlaczego deskryptory plików użycie TCP / IP Sockets jest to, że gdy interfejs gniazd został po raz pierwszy zaprojektowany i wdrożony ( w BSD Unix, w 1983 roku ), jego projektanci uważali, że połączenie sieciowe było analogiczne do pliku - można read
, write
i close
zarówno i pasowałoby to do uniksowego pomysłu „wszystko jest plikiem”.
Inne implementacje stosu sieciowego TCP / IP niekoniecznie integrują się z podsystemem wejścia / wyjścia systemu operacyjnego, na przykład MacTCP . Ale ponieważ interfejs gniazd BSD był tak popularny, nawet te inne implementacje zdecydowały się na replikację interfejsu API gniazda z jego funkcjami podobnymi do Uniksa, więc otrzymałeś „deskryptory plików”, używane tylko do komunikacji TCP / IP, w systemach, które inaczej nie miały mieć deskryptory plików.
Inną częścią twojego pytania jest to, dlaczego istnieje limit? Jest tak, ponieważ najszybszym sposobem zaimplementowania tabeli wyszukiwania deskryptorów plików jest użycie tablicy. Historycznie limit był mocno zakodowany w jądrze.
Oto kod w wersji Unix 7 (1979) z zakodowanym limitem 20 deskryptorów plików na proces:
Dla porównania Linux dynamicznie przydziela miejsce dla tabeli deskryptorów plików procesu. Domyślny limit bezwzględny to 8192, ale możesz ustawić to na co tylko chcesz. Mój system wyświetla listę 191072 w/proc/sys/fs/file-max
.
Pomimo, że nie ma już absolutnego limitu w Linuksie, nie chcemy jednak pozwolić programom zwariować, więc administrator (lub pakiet dystrybucyjny) ogólnie określa limity zasobów. Spójrz /etc/security/limits.conf
lub biegnij ulimit -n
.