Resume
O Que É File Descriptor ?
1File Descriptor é uma variável do tipo int que identifica um arquivo ou outro recurso que tenha um input e output, aberto no sistema através de um processo de indexação de processos a partir de índices que mostram as condições de inicialização de determinado arquivo.
2Quando um programa abre um arquivo, o sistema operacional atribui um número inteiro que serve como um ponteiro para esse arquivo, permitindo que o programa interaja com ele de maneira eficiente.
Int fd
File descriptors are small integers, typically ranging from 0 to 255.

3Além dos arquivos em si, o FD também considera informações sobre diretórios, partições, caracteres, muitas vezes chamados de “arquivos especiais”, canais específicos e nomeados, dispositivos de bloco e soquetes de domínio.
File Descriptor Em C
Nos sistemas Unix as três primeiras entradas do da tabela do file descriptor são automaticamente adicionadas.
- 0 ⇒ para stdin (Standard Input) , quando lemos inputs vindos do terminal.
- 1 ⇒ para stdout (Standard Output), para quando estamos escrevendo para o terminal (ex.: com write).
- 2 ⇒ para stderr (Standard Error), quando escrevemos um erro no terminal, util para redirecionamento de logs e monitoramento de erros.
As funções que oferecem abstrações para lidar com o fd em c são:
open()⇒para abrir um recursoread()⇒ para ler um recursoclose()⇒ para fechar um recurso
File Descriptor Em Linux
3Especialmente nas distro Linux, o file descriptor tem o seu acesso através do
/proc/PID/fd/. O PID, neste caso, deve ser substituído pelo identificador do processo.
Tipos De File Descriptors
- de arquivos regulares ⇒ para acessar aquivos do sistema
- de sockets ⇒ comunicação em rede
- de pipes ⇒ comunicação entre processos. Sim, existem limites na quantidade de file descriptors (FDs) que um processo pode ter abertas em Linux. Aqui estão os principais pontos sobre isso:
Limites De FDs
-
Cada processo tem seu próprio limite de FDs abertos.
-
Há dois tipos de limites:
- Limite suave (soft limit): valor máximo que um processo pode alcançar temporariamente.
- Limite duro (hard limit): valor máximo que um processo jamais poderá ultrapassar.
-
Os limites podem ser definidos de várias maneiras:
- Globalmente no kernel (
fs.file-max) - Por usuário no
/etc/security/limits.conf - Por processo individualmente
- Globalmente no kernel (
Verificação De Limites
Para verificar os limites atuais de um processo:
cat /proc/<PID>/limits | grep filesOu para o limite atual do usuário:
ulimit -nAumentando Os Limites
Existem várias formas de aumentar os limites:
-
Para o usuário atual:
ulimit -n <número> -
Para um processo específico:
prlimit --pid=<PID> --nofile=<número> -
Susturdamente para um usuário: Adicionar à
/etc/security/limits.conf:<usuario> soft nofile <valor> <usuario> hard nofile <valor> -
Globalmente no kernel:
sysctl fs.file-max=<valor>Adicionar ao
/etc/sysctl.confpara persistência.
Melhores Práticas
- Aumente os limites apenas quando necessário para o funcionamento adequado do sistema.
- Monitore o uso de FDs para evitar ultrapassar os limites.
- Considere otimizar o código para abrir menos FDs quando possível.
- Para aplicações que requerem muitos FDs, considere usar ferramentas como
epollem vez deselect.
Em resumo, embora haja limites, eles podem ser ajustados conforme necessário para atender às necessidades específicas de cada sistema ou aplicação.
Citations:
[1] https://www.baeldung.com/linux/limit-file-descriptors
[2] https://unix.stackexchange.com/questions/84227/limits-on-the-number-of-file-descriptors
[3] https://stackoverflow.com/questions/3734932/max-open-files-for-working-process
[4] https://medium.com/@b0ld8/unlock-open-file-limit-bc3b0733a5f4
[5] https://docs.oracle.com/cd/E19476-01/821-0505/file-descriptor-requirements.html
[6] https://www.cyberciti.biz/faq/viewing-open-file-limit-for-linux-process/
[8] https://help.fanruan.com/finebi-en/doc-view-5784.html
[9] https://www.tecmint.com/increase-set-open-file-limits-in-linux/