Quase todos os arquivos em /dev
são arquivos de dispositivo . Enquanto a leitura e gravação em um arquivo normal armazena dados em um disco ou outro sistema de arquivos, o acesso a um arquivo de dispositivo se comunica com um driver no kernel, que geralmente se comunica com um pedaço de hardware (um dispositivo de hardware, daí o nome).
Existem dois tipos de arquivos de dispositivo: dispositivos de bloco (indicados por b
como o primeiro caractere na saída de ls -l
) e dispositivos de caracteres (indicados por c
). A distinção entre dispositivos de blocos e caracteres não é completamente universal. Dispositivos de bloco são coisas como discos, que se comportam como arquivos grandes de tamanho fixo: se você escreve um byte em um determinado deslocamento e depois lê o dispositivo nesse deslocamento, recebe esse byte de volta. Os dispositivos de caracteres são praticamente qualquer outra coisa, onde escrever um byte tem algum efeito imediato (por exemplo, é emitido em uma linha serial) e a leitura de um byte também tem algum efeito imediato (por exemplo, é lido a partir da porta serial).
O significado de um arquivo de dispositivo é determinado pelo número, não pelo nome (o nome é importante para os aplicativos, mas não para o kernel). O número é na verdade dois números: o número principal indica qual driver é responsável por este dispositivo, e o número menor permite que um driver conduza vários dispositivos¹. Esses números aparecem na ls -l
lista, onde você normalmente encontra o tamanho do arquivo. Por exemplo, brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ este dispositivo é maior 8, menor 0.
Alguns arquivos de dispositivo em /dev
não correspondem a dispositivos de hardware. Um que existe em todo sistema unix é /dev/null
; gravar nele não tem efeito e a leitura dele nunca retorna nenhum dado. Geralmente é conveniente em scripts de shell, quando você deseja ignorar a saída de um comando ( >/dev/null
) ou executar um comando sem entrada ( </dev/null
). Outros exemplos comuns são /dev/zero
(que retorna bytes nulos ad infinitum ) /dev/urandom
(que retorna bytes aleatórios ad infinitum ).
Alguns arquivos de dispositivo têm um significado que depende do processo que o acessa. Por exemplo, /dev/stdin
designa a entrada padrão do processo atual; abrir from tem aproximadamente o mesmo efeito que abrir o arquivo original que foi aberto como entrada padrão do processo. De maneira semelhante, /dev/tty
designa o terminal ao qual o processo está conectado. Atualmente, no Linux, os /dev/stdin
amigos e os amigos não são implementados como dispositivos de caracteres, mas como links simbólicos para um mecanismo mais geral que permite que todos os descritores de arquivos sejam referenciados (em oposição a apenas 0, 1 e 2 no método tradicional); por exemplo, /dev/stdin
é um link simbólico para /proc/self/fd/0
. Veja Como o / dev / fd se relaciona com / proc / self / fd /? .
Você encontrará vários links simbólicos em /dev
. Isso pode ocorrer por razões históricas: um arquivo de dispositivo foi movido de um nome para outro, mas alguns aplicativos ainda usam o nome antigo. Por exemplo, /dev/scd0
é um link simbólico /dev/sr0
no Linux; ambos designam o primeiro dispositivo de CD. Outra razão para links simbólicos é a organização: no Linux, você encontrará seus discos rígidos e partições em vários lugares: /dev/sda
e /dev/sda1
e amigos (cada disco designada por uma letra arbitrária, e partições de acordo com o layout da partição), /dev/disk/by-id/*
(discos designado por um número de série único), /dev/disk/by-label/*
(partições com um sistema de arquivos, designado por uma etiqueta escolhida pelo homem); e mais. Links simbólicos também são usados quando um nome genérico de dispositivo pode ser um de vários; por exemplo/dev/dvd
pode ser um link simbólico para /dev/sr0
, ou pode ser um link para /dev/sr1
se você tiver dois leitores de CD e o segundo for o leitor de DVD padrão.
Por fim, existem alguns outros arquivos nos quais você pode encontrar /dev
, por motivos tradicionais. Você não encontrará o mesmo em todos os sistemas. Na maioria das unidades, /dev/log
é um soquete usado pelos programas para emitir mensagens de log. /dev/MAKEDEV
é um script que cria entradas no /dev
. Nos sistemas Linux modernos, as entradas /dev/
são criadas automaticamente pelo udev , obsoletas MAKEDEV
.
Actually Na verdade, isso não é mais verdade no Linux, mas esse detalhe é importante apenas para os gravadores de driver de dispositivo.