Outras respostas adicionaram ótimas coisas. Vou adicionar apenas meus 2 centavos.
De acordo com a Wikipedia, sabemos com certeza: um descritor de arquivo é um número inteiro não negativo. A coisa mais importante que acho que falta, seria dizer:
Os descritores de arquivo estão vinculados a um ID do processo.
Sabemos que os descritores de arquivos mais famosos são 0, 1 e 2. 0 corresponde a STDIN
, 1 a STDOUT
e 2 a STDERR
.
Digamos, considere os processos do shell como um exemplo e como ele se aplica a ele?
Confira este código
#>sleep 1000 &
[12] 14726
Criamos um processo com o ID 14726 (PID). Usando o lsof -p 14726
nós podemos obter coisas assim:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sleep 14726 root cwd DIR 8,1 4096 1201140 /home/x
sleep 14726 root rtd DIR 8,1 4096 2 /
sleep 14726 root txt REG 8,1 35000 786587 /bin/sleep
sleep 14726 root mem REG 8,1 11864720 1186503 /usr/lib/locale/locale-archive
sleep 14726 root mem REG 8,1 2030544 137184 /lib/x86_64-linux-gnu/libc-2.27.so
sleep 14726 root mem REG 8,1 170960 137156 /lib/x86_64-linux-gnu/ld-2.27.so
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
A 4ª coluna FD e a próxima coluna TYPE correspondem ao tipo de descritor de arquivo e descritor de arquivo.
Alguns dos valores para o FD podem ser:
cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device
Mas o descritor de arquivo real está em:
NUMBER – Represent the actual file descriptor.
O caractere após o número, ou seja, "1u", representa o modo em que o arquivo é aberto. r para leitura, w para gravação, u para leitura e gravação.
TYPE especifica o tipo do arquivo. Alguns dos valores dos TYPEs são:
REG – Regular File
DIR – Directory
FIFO – First In First Out
Mas todos os descritores de arquivo são CHR - arquivo especial de caractere (ou arquivo de dispositivo de caractere)
Agora, podemos identificar os descritores de arquivo para STDIN
, STDOUT
e STDERR
fácil com lsof -p PID
, ou podemos ver o mesmo se ls /proc/PID/fd
.
Observe também que a tabela de descritores de arquivos que o kernel controla não é a mesma que a tabela de arquivos ou a tabela de inodes. Estes são separados, como algumas outras respostas explicadas.
Você pode se perguntar onde estão esses descritores de arquivos fisicamente e o que é armazenado, /dev/pts/6
por exemplo
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
Bem, /dev/pts/6
vive puramente na memória. Esses arquivos não são comuns, mas os chamados arquivos de dispositivo de caracteres . Você pode verificar isso com: ls -l /dev/pts/6
e eles começarão com c
, no meu caso crw--w----
.
Apenas para lembrar, a maioria dos Linux como o SO define sete tipos de arquivos:
- Arquivos regulares
- Diretórios
- Arquivos de dispositivo de caracteres
- Bloquear arquivos de dispositivo
- Soquetes de domínio local
- Pipes nomeados (FIFOs) e
- Links simbólicos