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.