/dev/zero
é um exemplo de "arquivo especial" - particularmente, um "nó de dispositivo". Normalmente, eles são criados pelo processo de instalação da distribuição, mas você pode totalmente criá-los por conta própria, se quiser.
Se você perguntar ls
sobre /dev/zero
:
# ls -l /dev/zero
crw-rw-rw- 1 root root 1, 5 Nov 5 09:34 /dev/zero
O "c" no início diz que este é um "dispositivo de caractere"; o outro tipo é "dispositivo de bloco" (impresso por ls
como "b"). Mais ou menos, os dispositivos de acesso aleatório, como discos rígidos, tendem a ser dispositivos de bloco, enquanto itens sequenciais, como unidades de fita ou sua placa de som, tendem a ser dispositivos de caractere.
A parte "1, 5" é o "número do dispositivo principal" e o "número do dispositivo secundário".
Com essas informações, podemos usar o comando mknod
para criar nosso próprio nó de dispositivo:
# mknod foobar c 1 5
Isso cria um novo arquivo chamado foobar
, na pasta atual, que exatamente é a mesma coisa que /dev/zero
. (É claro que você pode definir diferentes permissões se quiser.) Tudo o que "arquivo" realmente contém são os três itens acima - tipo de dispositivo, número maior, número menor. Você pode usar ls
para procurar os códigos de outros dispositivos e recriá-los também. Quando você se cansar, basta usar rm
para remover os nós de dispositivo que você acabou de criar.
Basicamente, o número principal informa ao kernel Linux com qual driver de dispositivo conversar, e o número menor informa ao driver de dispositivo de qual dispositivo você está falando. (Por exemplo, você provavelmente tem um controlador SATA, mas talvez vários discos rígidos sejam conectados a ele.)
Se você quiser inventar novos dispositivos que fazem algo novo ... bem, você precisará editar o código-fonte para o kernel Linux e compilar seu próprio kernel personalizado. Então não vamos fazer isso! :-) Mas você pode adicionar arquivos de dispositivos que duplicam aqueles que você já tem muito bem. Um sistema automatizado como o udev basicamente está apenas assistindo a eventos de dispositivos e chamando mknod
/ rm
automaticamente. Nada mais mágico que isso.
Ainda existem outros tipos de arquivos especiais:
-
O Linux considera um diretório como um tipo especial de arquivo. (Normalmente você não pode abrir diretamente um diretório, mas se pudesse, você descobriria que é um arquivo normal que contém dados em um formato especial e diz ao kernel onde encontrar todos os arquivos naquele diretório.)
-
Um link simbólico é um arquivo especial. (Mas um link físico não é.) Você pode criar links simbólicos usando o comando
ln -s
. (Procure a manpage para isso.) -
Há também uma coisa chamada "pipe nomeado" ou "FIFO" (fila de entrada e saída). Você pode criar um com
mkfifo
. Um FIFO é um arquivo mágico que pode ser aberto por dois programas ao mesmo tempo - uma leitura, uma escrita. Quando isso acontece, funciona como um tubo de shell normal. Mas você pode iniciar cada programa separadamente ...
Um arquivo que não é "especial" é chamado de "arquivo normal". Você ocasionalmente verá isso na documentação do Unix. Isso é o que significa; um arquivo que não é um nó de dispositivo ou um symlink ou qualquer outra coisa. Apenas um arquivo normal, todos os dias, sem propriedades mágicas.