5.4. Les fichiers « spéciaux  » : fichiers mode bloc et caractère

Comme il a déjà été dit, de tels fichiers sont soit des fichiers créés par le système, soit bien des périphériques de votre machine. Nous avons aussi mentionné que le contenu des fichiers en mode bloc était gardé en mémoire alors que tel n'était pas le cas des fichiers en mode caractère. Pour illustrer ceci, insérez une disquette quelconque dans le lecteur et tapez la commande suivante deux fois de suite :

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

Vous pouvez observer la chose suivante : tandis que, la première fois que la commande a été lancée, tout le contenu de la disquette a été lu, la deuxième fois il n'y a eu aucun accès au lecteur de disquette. C'est simplement parce que le contenu de la disquette a été gardé en mémoire quand vous avez lancé la commande la première fois ( et que vous n'avez pas changé de disquette entre temps.

Mais maintenant, si vous voulez imprimer un gros fichier de cette façon (si, ça fonctionne) :

$ cat /un/gros/fichier/imprimable/quelque/part >/dev/lp0

la commande prendra autant de temps que vous la tapiez une, deux ou cinquante fois. Ceci est dû au fait que /dev/lp0 est un fichier en mode caractère, et son contenu n'est pas gardé en mémoire.

Le fait que le contenu des fichiers en mode bloc soit gardé en mémoire a un effet de bord agréable : non seulement les lectures sont gardées en mémoire, mais c'est aussi le cas des écritures. Cela autorise les écritures sur disque à être asynchrones : quand vous écrivez un fichier sur disque, l'opération d'écriture elle-même ne sera pas faite immédiatement. Elle n'aura lieu que quand Linux le décidera.

Enfin, chacun de ces fichiers spéciaux possède un numéro majeur et un numéro mineur. Sur la sortie d'un ls -l, ils apparaissent en lieu et place de la taille, étant donné que la taille pour de tels fichiers est hors de propos :

$ ls -l /dev/hda /dev/lp0
brw-rw----    1 root     disk       3,   0 mai  5  1998 /dev/hda
crw-rw----    1 root     daemon     6,   0 mai  5  1998 /dev/lp0

Ici, les numéros majeur et mineur de /dev/hda sont respectivement 3 et 0, tandis que ce sont respectivement 6 et 0 pour /dev/lp0. Notez que ces numéros sont uniques par catégorie de fichier, ce qui veut dire qu'il peut exister un fichier en mode caractère ayant 3 pour majeur et 0 pour mineur (un tel fichier existe  : c'est /dev/ttyp0), et de la même façon il peut y avoir un fichier en mode bloc ayant 6 pour majeur et 0 pour mineur. Ces nombres existent pour une raison bien simple : cela permet à Linux d'associer les bonnes opérations aux fichiers (donc aux péripériques auxquels ces fichiers se réfèrent). On ne contrôle pas un lecteur de disquettes de la même façon que, par exemple, un disque dur SCSI.