A razão pela qual os soquetes TCP / IP usam descritores de arquivos é que, quando a interface de soquetes foi projetada e implementada pela primeira vez ( no BSD Unix, em 1983 , seus projetistas sentiram que uma conexão de rede era análoga a um arquivo - você pode read
, write
e close
, e que ela se encaixaria bem com a ideia Unix de "tudo é um arquivo".
Outras implementações de pilha de rede TCP / IP não necessariamente se integraram ao subsistema de E / S de seu SO, um exemplo sendo MacTCP . Mas como a interface de soquetes BSD era tão popular, até mesmo essas outras implementações optaram por replicar a API de soquete com suas funções semelhantes a Unix, então você tem "descritores de arquivo", usados apenas para comunicação TCP / IP, em sistemas que não tem descritores de arquivos.
A outra parte da sua pergunta é porque existe um limite? É porque a maneira mais rápida de implementar uma tabela de pesquisa do descritor de arquivos é com uma matriz. Historicamente, o limite foi codificado no kernel.
Aqui está o código no Unix release 7 (1979) com um limite de 20 descritores de arquivo por processo:
-
user.h :
struct file *u_ofile[NOFILE]
-
param.h :
#define NOFILE 20
Por comparação, o Linux aloca dinamicamente o espaço para a tabela de descritores de arquivos de um processo. O limite absoluto é padronizado para 8192, mas você pode definir isso como quiser. Meu sistema lista 191072 em /proc/sys/fs/file-max
.
Apesar de não haver limite absoluto no Linux, no entanto, não queremos deixar os programas enlouquecerem, então o administrador (ou o empacotador de distribuição) geralmente define os limites de recursos. Dê uma olhada em /etc/security/limits.conf
ou execute ulimit -n
.