La ragione per cui i descrittori di file uso di TCP / IP socket è che, quando l'interfaccia socket è stato progettato prima e implementato ( in BSD Unix, nel 1983 ), i suoi progettisti ha ritenuto che una connessione di rete è stato analogo a un file - è possibile read
, write
e close
sia e che si adatterebbe perfettamente all'idea Unix di "tutto è un file".
Altre implementazioni dello stack di rete TCP / IP non si sono necessariamente integrate con il sottosistema di I / O dei file del loro sistema operativo, ad esempio MacTCP . Ma poiché l'interfaccia dei socket BSD era così popolare, anche queste altre implementazioni hanno scelto di replicare l'API socket con le sue funzioni simili a Unix, quindi hai ottenuto "descrittori di file", usati solo per la comunicazione TCP / IP, su sistemi che altrimenti non avrebbero hanno descrittori di file.
L'altra parte della tua domanda è: perché c'è un limite? È perché il modo più rapido per implementare una tabella di ricerca del descrittore di file è con un array. Storicamente, il limite è stato codificato nel kernel.
Ecco il codice in Unix versione 7 (1979) con un limite codificato di 20 descrittori di file per processo:
In confronto, Linux alloca dinamicamente lo spazio per la tabella descrittore di file di un processo. Il limite assoluto predefinito è 8192, ma puoi impostarlo come preferisci. Il mio sistema elenca 191072 in /proc/sys/fs/file-max
.
Nonostante non ci siano più limiti assoluti in Linux, tuttavia non vogliamo far impazzire i programmi, quindi l'amministratore (o il pacchetto di distribuzione) generalmente imposta limiti di risorse. Dai un'occhiata /etc/security/limits.conf
o corri ulimit -n
.