Der Grund , warum TCP / IP - Sockets verwenden Filedeskriptoren das heißt, wenn die Sockets - Schnittstelle erste (entworfen und implementiert wurde im Jahr 1983 in BSD Unix, ), die Designer das Gefühl , dass eine Netzwerkverbindung zu einer Datei analog war - man kann read
, write
und close
beide , und dass es gut zur Unix-Idee "Alles ist eine Datei" passt.
Andere TCP / IP-Netzwerkstapelimplementierungen waren nicht unbedingt in das Datei-E / A-Subsystem ihres Betriebssystems integriert, beispielsweise MacTCP . Aber weil die BSD-Sockets-Schnittstelle so beliebt war, haben sich auch diese anderen Implementierungen dafür entschieden, die Socket-API mit ihren Unix-ähnlichen Funktionen zu replizieren, sodass Sie "Dateideskriptoren" erhalten, die nur für die TCP / IP-Kommunikation auf Systemen verwendet werden, auf denen dies nicht der Fall war Dateideskriptoren haben.
Der andere Teil Ihrer Frage ist, warum es ein Limit gibt. Dies liegt daran, dass eine Nachschlagetabelle für Dateideskriptoren am schnellsten mit einem Array implementiert werden kann. In der Vergangenheit war das Limit im Kernel fest programmiert.
Hier ist der Code in Unix Release 7 (1979) mit einer fest codierten Beschränkung von 20 Dateideskriptoren pro Prozess:
Zum Vergleich: Linux reserviert dynamisch Speicherplatz für die Dateideskriptortabelle eines Prozesses. Das absolute Limit ist standardmäßig 8192, aber Sie können es auf jeden beliebigen Wert einstellen. Mein System listet 191072 in /proc/sys/fs/file-max
.
Obwohl es unter Linux kein absolutes Limit mehr gibt, möchten wir Programme nicht verrückt machen, weshalb der Administrator (oder der Distributions-Packager) im Allgemeinen Ressourcenlimits festlegt. Schauen Sie sich das an /etc/security/limits.conf
oder rennen Sie davon ulimit -n
.