Nous avons déjà mentionné que ces fichiers peuvent être soit des fichiers créés par le système, soit des périphériques de votre machine, et 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 : le premier lancement de la commande enclenche la lecture du contenu complet de la disquette alors qu'aucun accès au lecteur de disquette n'est effectué lors de la deuxième entrée de la commande. La résolution du mystère est simple : le contenu de la disquette a été gardé en mémoire lors de la première exécution de la commande (à la condition évidente que vous n'ayez pas changé de disquette entre temps !).
Et si, maintenant, vous avez envie d'imprimer un fichier de taille importante de cette façon :
$ cat /un/gros/fichier/imprimable/quelque/part >/dev/lp0
Que vous la tapiez une, deux ou cinquante
fois, la commande prendra en fait autant de temps. Tout simplement
parce que /dev/lp0
est un fichier en mode
caractère et que son contenu n'est donc pas gardé en
mémoire.
Le fait que le contenu des
fichiers en mode bloc soit gardé en mémoire comporte un effet de bord
agréable : non seulement les lectures sont gardées en mémoire,
mais également les écritures. Cela permet aux écritures sur disque
d'être asynchrones : quand vous écrivez un fichier sur disque,
l'opération d'écriture elle-même ne sera pas accomplie
immédiatement. Elle n'aura lieu que quand Linux décidera de
lancer l'écriture physique. Cependant, si nécessaire, ce comportement
peut être modifié pour chaque système de fichier ; étudiez les
options sync
et async
de la page de
man
mount(8) ainsi que Section 7, « Les attributs des fichiers » pour
plus de détails.
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, puisque celle-ci n'entre pas en ligne de compte pour de tels fichiers :
$ ls -l /dev/hdc /dev/lp0 brw-rw---- 1 reine cdrom 22, 0 Feb 23 19:18 /dev/hdc crw-rw---- 1 root root 6, 0 Feb 23 19:17 /dev/lp0
Les numéros majeur et mineur
de /dev/hdc
sont, respectivement 22 et 0, ici,
et 6 et 0 pour /dev/printers/0
. Notez que ces
chiffres sont uniques pour chaque catégorie de fichier : il
peut ainsi exister un fichier en mode caractère ayant 22 pour
majeur et 0 pour mineur, ou encore un fichier en mode bloc ayant 6
pour majeur et 0 pour mineur. Ces numéros majeurs et mineurs
existent pour une raison bien simple : ils permettent au noyau
d'associer les bonnes opérations aux bons fichiers (en fait, aux
périphériques auxquels ces fichiers se réfèrent). En effet, on ne
contrôle pas un lecteur de disquettes de la même façon que, par
exemple, un disque dur SCSI.