Quase todos os arquivos em /dev
são arquivos de dispositivos . Enquanto ler e gravar em um arquivo regular armazena dados em um disco ou outro sistema de arquivos, acessar um arquivo de dispositivo se comunica com um driver no kernel, que geralmente se comunica com uma peça de hardware (um dispositivo de hardware, daí o nome). / p>
Existem dois tipos de arquivos de dispositivos: dispositivos de bloco (indicados por b
como o primeiro caractere na saída de ls -l
) e dispositivos de caractere (indicados por c
). A distinção entre dispositivos de bloco 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ê escrever um byte em um determinado deslocamento e, posteriormente, ler o dispositivo nesse deslocamento, receberá esse byte de volta. 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 ler 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 seu número, não pelo seu 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 menor número permite que um driver conduza vários dispositivos¹. Esses números aparecem na lista ls -l
, onde você normalmente encontraria 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 dispositivos em /dev
não correspondem a dispositivos de hardware. Um que existe em cada sistema unix é /dev/null
; escrever para ele não tem efeito, e a leitura nunca retorna nenhum dado. Geralmente é conveniente em shell scripts, 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 dispositivos têm um significado que depende do processo que os acessa. Por exemplo, /dev/stdin
designa a entrada padrão do processo atual; a abertura a partir de tem o mesmo efeito que a duplicação da entrada padrão². Algo semelhante, /dev/tty
designa o terminal ao qual o processo está conectado. No Linux, hoje em dia, /dev/stdin
e amigos não são implementados como dispositivos de caractere, mas sim como links simbólicos para um mecanismo mais geral que permite que cada descritor de arquivo seja referenciado (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 / dev / fd se relaciona com / proc / self / fd /? .
Você encontrará vários links simbólicos em /dev
. Isso pode ocorrer por motivos históricos: 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 para /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 designado por uma letra arbitrária e partições de acordo com o layout da partição) /dev/disk/by-id/*
(discos designados por um único número de série), /dev/disk/by-label/*
(partições com um sistema de arquivos, designado por um rótulo escolhido pelo ser humano); e mais. Os links simbólicos também são usados quando um nome de dispositivo genérico pode ser um dos 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 que você pode encontrar em /dev
, por motivos tradicionais. Você não encontrará o mesmo em todos os sistemas. Na maioria dos unices, /dev/log
é um soquete que os programas usam para emitir mensagens de log. /dev/MAKEDEV
é um script que cria entradas em /dev
. Nos sistemas Linux modernos, as entradas em /dev/
são criadas automaticamente por udev , obsoleto MAKEDEV
.
¹ Isso não é mais verdade no Linux, mas esse detalhe é importante apenas para os gravadores de driver de dispositivo.
² Duplicar um descritor de arquivo significa criar um novo descritor de arquivo que acessa o mesmo arquivo que o primeiro. A chamada de sistema correspondente é dup
: open("/dev/stdin", flags)
é igual a dup(0)
, exceto que o novo descritor pode ser criado com diferentes modos de acesso.