La razón por qué sockets TCP / IP descriptores de fichero uso es que, cuando la interfaz de sockets fue diseñado e implementado (primero en BSD Unix, en 1983 ), sus diseñadores consideró que una conexión de red fue análoga a un archivo - que puedas read
, write
y close
tanto , y que encajaría bien con la idea de Unix de "todo es un archivo".
Otras implementaciones de pila de red TCP / IP no necesariamente se integraron con el subsistema de E / S de archivo de su sistema operativo, un ejemplo es MacTCP . Pero debido a que la interfaz de sockets BSD era tan popular, incluso estas otras implementaciones optaron por replicar la API de sockets con sus funciones tipo Unix, por lo que obtuviste "descriptores de archivos", que solo se utilizan para la comunicación TCP / IP, en sistemas que no lo hicieron de otra manera tener descriptores de archivo.
La otra parte de su pregunta es ¿por qué hay un límite? Se debe a que la forma más rápida de implementar una tabla de búsqueda de descriptores de archivo es con una matriz. Históricamente, el límite estaba codificado en el núcleo.
Aquí está el código en Unix versión 7 (1979) con un límite codificado de 20 descriptores de archivo por proceso:
En comparación, Linux asigna dinámicamente espacio para la tabla de descriptores de archivo de un proceso. El límite absoluto predeterminado es 8192, pero puede establecerlo en lo que quiera. Mi sistema enumera 191072 en /proc/sys/fs/file-max
.
A pesar de que ya no existe un límite absoluto en Linux, no queremos dejar que los programas se vuelvan locos, por lo que el administrador (o el empaquetador de distribución) generalmente establece límites de recursos. Echa un vistazo /etc/security/limits.conf
o corre ulimit -n
.