File Descriptors no Linux | Linux
- File Descriptors (FD) | Linux

O que é um File Descriptor
Um file descriptor (FD) é basicamente um número inteiro que o sistema operacional usa para identificar recursos abertos por um processo.
Não é só arquivo. Qualquer coisa que possa ser lida/escrita vira um FD:
- arquivos (
.txt,.log) - sockets (rede)
- pipes
- dispositivos (
/dev/null,/dev/random)
👉 Em termos simples:
FD = "handle" que o processo usa para acessar algo aberto
Como funciona na prática
Quando um processo abre algo, o kernel devolve um número:
int fd = open("arquivo.txt", O_RDONLY);
Exemplo de retorno:
fd = 3
Isso significa:
- o processo agora usa o número 3 para acessar esse arquivo
- todas as operações usam esse número:
read(3, buffer, 100);
write(3, buffer, 100);
close(3);
FDs padrão (sempre existem)
Todo processo inicia com 3 FDs padrão:
| FD | Nome | Descrição |
|---|---|---|
| 0 | stdin | entrada padrão |
| 1 | stdout | saída padrão |
| 2 | stderr | erro padrão |
Exemplo:
ls > out.txt
Aqui:
- stdout (1) → redirecionado para arquivo
ls 2> erro.txt
- stderr (2) → redirecionado
Representação mental (muito importante)
Pense assim:
Processo
├── FD 0 → teclado
├── FD 1 → terminal
├── FD 2 → terminal (erro)
├── FD 3 → arquivo.txt
├── FD 4 → conexão TCP
Cada FD aponta para um recurso aberto.
Onde ver os file descriptors
No Linux, tudo fica em:
/proc/<PID>/fd
Exemplo:
ls -l /proc/1234/fd
Saída típica:
0 -> /dev/pts/0
1 -> /dev/pts/0
2 -> /dev/pts/0
3 -> /var/log/app.log
4 -> socket:[12345]
Limite de File Descriptors
Cada processo tem um limite de FDs abertos.
Ver limite atual:
ulimit -n
Exemplo:
1024
👉 Problema comum: Se ultrapassar esse limite:
Too many open files
Alterando limite
Tem dois níveis:
Temporário (shell atual)
ulimit -n 65535
Permanente
Editar:
/etc/security/limits.conf
Exemplo:
usuario soft nofile 65535
usuario hard nofile 65535
E também garantir:
/etc/pam.d/common-session
Contém:
session required pam_limits.so
Por que isso é crítico
Aplicações modernas usam MUITOS FDs:
- APIs (cada conexão HTTP = socket = FD)
- RabbitMQ consumers
- Redis connections
- arquivos de log
Exemplo real:
- 10k conexões simultâneas → 10k FDs
Se não ajustar:
- queda de conexão
- erro em produção
- comportamento instável
Caso prático (seu cenário)
Com:
- SignalR
- RabbitMQ
- múltiplos clientes
Você provavelmente terá:
- 1 FD por conexão websocket
-
- conexões internas (Redis, Rabbit, DB)
👉 Ou seja:
6000 clientes ≈ 6000+ FDs
Se o limite for 1024 → vai quebrar
Boas práticas
- aumentar
ulimit -npara pelo menos 65535 - monitorar uso:
lsof -p <PID> | wc -l
- fechar conexões corretamente (
close) - usar pooling (DB, HTTP, etc.)
Comandos úteis
Ver todos FDs abertos no sistema
lsof
Ver FDs de um processo
lsof -p <PID>
Contar FDs de um processo
ls /proc/<PID>/fd | wc -l
Ver quem está consumindo mais
lsof | awk '{print $1}' | sort | uniq -c | sort -nr
Resumo direto
- FD é um número que representa algo aberto
- tudo no Linux vira FD
- cada conexão = 1 FD
- existe limite → pode derrubar sistema
- sistemas de alta escala precisam ajustar isso obrigatoriamente