La raison pour laquelle les descripteurs de fichiers utilisation de TCP / IP est que, lorsque l'interface sockets a été conçu et mis en œuvre ( dans BSD Unix, en 1983 ), ses concepteurs a estimé qu'une connexion réseau est analogue à un fichier - vous pouvez read
, write
et à la close
fois , et qu'il cadrerait bien avec l'idée Unix de "tout est un fichier".
D'autres implémentations de pile réseau TCP / IP ne s'intégraient pas nécessairement avec le sous-système d'E / S de fichiers de leur système d'exploitation, un exemple étant MacTCP . Mais parce que l'interface des sockets BSD était si populaire, même ces autres implémentations ont choisi de répliquer l'API de socket avec ses fonctions de type Unix, vous avez donc obtenu des "descripteurs de fichiers", uniquement utilisés pour la communication TCP / IP, sur des systèmes qui ne le faisaient pas autrement avoir des descripteurs de fichiers.
L'autre partie de votre question est: pourquoi y a-t-il une limite? C'est parce que le moyen le plus rapide d'implémenter une table de recherche de descripteur de fichier est avec un tableau. Historiquement, la limite était codée en dur dans le noyau.
Voici le code d'Unix version 7 (1979) avec une limite codée en dur de 20 descripteurs de fichier par processus:
Par comparaison, Linux alloue dynamiquement de l'espace pour la table de descripteurs de fichiers d'un processus. La limite absolue par défaut est 8192, mais vous pouvez la régler à votre guise. Mon système affiche 191072 pouces /proc/sys/fs/file-max
.
Bien qu'il n'y ait plus de limite absolue sous Linux, nous ne voulons cependant pas laisser les programmes devenir fous, donc l'administrateur (ou le conditionneur de distribution) fixe généralement des limites de ressources. Jetez un œil /etc/security/limits.conf
ou courez ulimit -n
.