A razão por que os descritores de arquivo usar TCP / IP soquetes é que, quando a interface soquetes foi inicialmente concebido e implementado ( em BSD Unix, em 1983 ), seus criadores sentiram que uma conexão de rede foi análogo a um arquivo - você pode read
, write
e close
tanto , e que se encaixaria bem com a idéia do Unix de "tudo é um arquivo".
Outras implementações de pilha de rede TCP / IP não se integraram necessariamente ao subsistema de E / S de arquivos do sistema operacional, um exemplo sendo o MacTCP . Mas como a interface de soquetes BSD era tão popular, mesmo essas outras implementações optaram por replicar a API de soquete com suas funções semelhantes ao Unix, então você obteve "descritores de arquivo", usados apenas para comunicação TCP / IP, em sistemas que não possui descritores de arquivo.
A outra parte da sua pergunta é por que existe um limite? Isso ocorre porque a maneira mais rápida de implementar uma tabela de pesquisa de descritores de arquivos é com uma matriz. Historicamente, o limite era codificado no kernel.
Aqui está o código do Unix, versão 7 (1979), com um limite codificado de 20 descritores de arquivos por processo:
Por comparação, o Linux aloca espaço dinamicamente para a tabela de descritores de arquivos de um processo. O limite absoluto é 8192, mas você pode configurá-lo como desejar. Meu sistema lista 191072 pol /proc/sys/fs/file-max
.
Apesar de não haver mais nenhum limite absoluto no Linux, mesmo assim, não queremos deixar os programas enlouquecerem, portanto o administrador (ou o empacotador de distribuição) geralmente define limites de recursos. Dê uma olhada /etc/security/limits.conf
ou corra ulimit -n
.