5. Arquivos Especiais: Arquivos de Caractere e de Bloco

Como já mencionado anteriormente, estes arquivos são criados pelo sistema ou por periféricos na sua máquina. Nós também já mencionamos que o conteúdo dos arquivos de bloco são armazenados em buffer, enquanto os arquivos de caractere não. Para ilustrarmos isto, insira um diquete no drive e digite o seguinte comando duas vezes:

$ dd if=/dev/fd0 of=/dev/null

Você deve ter observado o seguinte: a primeira vez que o comando foi executado, todo o conteúdo do disquete foi lido. Na segunda vez que você executou o comando, não houve acesso algum ao drive de disquete. Isto aconteceu porque o conteúdo do disquete foi armazenado em buffer na primeira vez que você executou o comando — e você não alterou nada no disquete entre os dois comandos.

Mas, se você quiser imprimir um arquivo grande desta maneira (sim, vai funcionar):

$ cat /a/big/printable/file/somewhere >/dev/lp0

O comando vai levar o mesmo tempo para ser executado uma, duas, ou cinqüenta vezes. Isto porquê o /dev/lp0 é um arquivo de caractere, e o seu conteúdo não é armazenado em buffer.

Existe um lado bom no fato dos arquivos de bloco serem armazenados em buffers: não apenas as leituras são feitas do buffer, mas as escritas também são armazenadas. Isto permite que a escrita em disco seja assíncrona: quando você escreve um arquivo em disco, a operação de escrita propriamente dita não é imediata. Ela irá acontecer quando o kernel Linux decidir executar a escrita no hardware. É claro que, se você precisar ele poderá ser sobrescrito para um determinado sisteam de arquivos; dê uma olhada nas opções sync e async na man page mount(8) e também na Seção 7, “Atributos de Arquivo” para mais detalhes.

Finalmente, cada arquivo especial possui um número principal e um número secundário. Na saída do ls -l, eles aparecem no lugar do tamanho, já que o tamanho para estes arquivos é irrelevante:

$ ls -l /dev/hdc /dev/lp0 
brw-rw----  1 usuario1 cdrom 22, 0 Feb 23 19:18 /dev/hdc
crw-rw----  1 root root 6, 0 Feb 23 19:17 /dev/lp0

Aqui, o número principal e o secundário do /dev/hdc são 22 e 0, enquanto para o /dev/lp0, eles são 6 e 0. Note que estes números são únicos por categoria de arquivo, o qual significa que pode haver um arquivo de caractere com número principal 22 e secundário 0, e de maneira similar, pode haver um arquivo de bloco com principal 6 e secundário 0. Estes números existem por uma simples razão: eles permitem ao kernel associarem as operações corretas a estes arquivos (isto é, aos periféricos que estes arquivos se referem): você não gerencia um drive de disquete da mesma maneira que um disco rígido SCSI, por exemplo.