Descrição
É o componente básico de qualquer sistema Unix-like. Nesses sistemas, tudo é tratado como arquivos e possui localização dentro do sistema de arquivos.
Tipos de arquivos
No Linux, um arquivo pode ser comum ou especial.
- arquivo comum – armazena informações e pode ser de texto, de áudio, de imagem, binários, etc.
- diretório – contém outros arquivos e/ou outros diretórios.
- dispositivo – representa um dispositivo físico (hardware) do sistema. Existem dois tipos:
- de caracteres – as operações de E/S são feitas de forma sequencial.
- de blocos – as operações de E/S são feitas usando blocos de caracteres.
- link simbólico – aponta para outro arquivo.
- pipe – utilizado para comunicação entre processos.
- socket – utilizado para comunicação entre processos.
No sistema, é possível identificar o tipo do arquivo usando o comando ls ou o comando file. Por exemplo, se queremos informações sobre o arquivo teste, basta digitar
ls -l teste
Suponha que a saída do comando é mostrada abaixo.
-rw-rw-r−− 1 aluno aluno 7743 Jan 25 16:52 teste
O campo -rw-rw-r−− indica o tipo e as permissões do arquivo, onde o primeiro caractere “-” informa que teste é um arquivo comum e os outros caracteres informam que o dono do arquivo (aluno) pode ler e escrever no arquivo, o grupo do arquivo (aluno) também pode ler e escrever no arquivo, mas os outros usuários só podem ler.
Também podemos usar
file teste
para verificar o tipo do arquivo. A resposta abaixo informa que teste é um arquivo de texto que usa o conjunto de caracteres Unicode com a codificação UTF-8.
teste: UTF-8 Unicode text
A tabela abaixo mostra como os tipos de arquivos são referenciados dentro do Linux.
| Tipo | Representação |
| arquivo comum | – |
| diretório | d |
| dispositivo de caracteres | c |
| dispositivo de blocos | b |
| link simbólico | l |
| pipe | p |
| socket | s |
Descritor de arquivo
No Linux, o shell normalmente opera com três descritores de arquivo sempre abertos: um arquivo que serve de entrada padrão dos dados; um arquivo utilizado como saída padrão dos dados; e um arquivo onde as mensagens de erros são gravadas. Estes descritores são definidos em /usr/include/unistd.h conforme a tabela abaixo.
| FD | Nome | Descrição |
| 0 | stdin (standard input) | Entrada padrão (normalmente, o teclado) |
| 1 | stdout (standard output) | Saída padrão (normalmente, o terminal) |
| 2 | stderr (standard error) | Erro padrão (normalmente, o terminal) |
Quando um processo é criado a partir do shell, ele herda cópias desses descritores. Se redicionadores de E/S são especificados na linha de comandos, o shell altera a definição dos descritores antes de inicializar o processo.
Cada processo possui uma tabela (process descriptor table) com informações necessárias a sua execução. Esta tabela aponta para uma outra tabela (file descriptor table) que contém ponteiros para todos os arquivos abertos do processo. Esta tabela já é criada com as três primeiras células apontando para os arquivos padrão: stdin, stdout e stderr. Quando algum outro arquivo é aberto, uma nova entrada na tabela é criada no primeiro slot disponível.

Exemplos
No Linux, o conjunto dos descritores abertos de um processo pode ser visto em /proc/PID/fd/ onde PID é o identificador do processo. Por exemplo, para ver o PID do shell sendo usado em um terminal, digite
ps
Suponha que a resposta é mostrada abaixo. Portanto, o PID do shell bash é 4212.
| PID | TTY | TIME CMD |
| 4212 | pts/0 | 00:00:00 bash |
| 4140 | pts/0 | 00:00:00 ps |
Para ver os arquivos abertos para o bash, basta digitar
ls -l /proc/4212/fd
A saída abaixo mostra que existem 4 arquivos abertos: 0 (stdin), 1 (stdout), 2 (stderr) e 255 (cópia dos fds para uso interno do bash caso os fds padrões sejam redirecionados). Note que os arquivos mostrados são links para o arquivo /dev/pts/11.
total 0
lrwx−−−−−− 1 aluno aluno 64 Abr 25 13:28 0 -> /dev/pts/0
lrwx−−−−−− 1 aluno aluno 64 Abr 25 13:28 1 -> /dev/pts/0
lrwx−−−−−− 1 aluno aluno 64 Abr 25 13:28 2 -> /dev/pts/0
lrwx−−−−−− 1 aluno aluno 64 Abr 25 14:04 255 -> /dev/pts/0
lrwx−−−−−− 1 aluno aluno 64 Abr 25 14:04 6 -> /dev/pts/0
O fd 255 é um descritor de arquivo especial e interno utilizado pelo bash para manter uma referência à sua conexão com o TTY (terminal) ou ao arquivo de script que está sendo executado.
O fd 6 pode ser um arquivo, um pipe ou um socket, aberto manualmente pelo bash.
Entradas em /dev/pts são na realidade pseudo-terminais: aplicações usam esses terminais para receber e mostrar dados. Para verificar isto, digite
ls -l /dev/pts/0
Abaixo, é mostrada uma possível saída.
crw−−w−−−− 1 aluno tty 136, 11 Abr 25 14:34 /dev/pts/0
Limites
- Para saber o número máximo de fds suportados no sistema, digite
cat /proc/sys/fs/file-max
Uma possível resposta:
9223372036854775807
- Para verificar o uso atual dos arquivos no sistema, basta digitar
cat /proc/sys/fs/file-nr
A resposta exibe 3 valores: o número de identificadores de arquivo alocados (13696), o número de identificadores alocados, mas não utilizados (zero) e o número máximo de identificadores de arquivo permitidos (9223372036854775807).
13696 0 9223372036854775807
- Para ver o número máximo de fds que um processo pode alocar, use o comando ulimit
ulimit -Sn
Abaixo a resposta do kernel 6.8.
1024
- Para ver o número máximo de fds que o administrador do sistema (root) pode autorizar para os processos
ulimit -Hn
Uma possível resposta é
1048576
Observações
- O comando fuser identifica os processos que estão usando um determinado arquivo.
- O comando lsof lista os arquivos abertos.
- O comando stat fornece informações sobre arquivos.