Los archivos especiales: modo bloque y caracter

Como ya se mencionó, dichos archivos son archivos creados por el sistema, o bien representan periféricos en su máquina. También hemos mencionado que el contenido de los archivos en modo bloque está guardado en memoria mientras que el de los de modo caracter no lo está. Para ilustrar esto, inserte un disquete en la disquetera e ingrese el comando siguiente dos veces:

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

Usted puede observar lo siguiente: mientras que, la primera vez que se lanzó el comando, se leyó todo el contenido del disquete, la segunda vez no se accedió a la disquetera en absoluto. Esto se debe simplemente a que el contenido de la disquetera se guardó en memoria la primera vez que se lanzó el comando – y entre tanto Usted no cambie el disquete, el mismo permanece allí.

Pero ahora, si quiere imprimir un archivo grande de esta forma (sí, va a funcionar):

$ cat /un/archivo/grande/imprimible/en/algun/lugar >/dev/lp0

el comando tardará el mismo tiempo si lo lanza una vez, dos veces, o cincuenta veces. Esto se debe a que /dev/lp0 es un archivo de modo caracter y su contenido no se conserva en memoria.

El hecho de que los archivos de modo bloque se conserven en memoria tiene un efecto secundario interesante: no sólo se conservan las lecturas sino también las escrituras. Esto permite que las escrituras en el disco sean asíncronas: cuando Usted escribe un archivo en disco, la operación de escritura en sí misma no es inmediata. Sólo ocurrirá cuando el núcleo GNU/Linux decida ejecutar la escritura en el hardware.

Finalmente, cada archivo especial tiene un número mayor y uno menor. Aparecen en la respuesta de ls -l, en lugar del tamaño, debido a que el tamaño para este tipo de archivos es irrelevante:

$ ls -l /dev/ide/host0/bus0/target0/lun0/disc /dev/printers/0 
brw-------  1 root root 3, 0 dic 31  1969 /dev/ide/host0/bus0/target0/lun0/disc
crw-rw----  1 lp   sys  6, 0 dic 31  1969 /dev/printers/0

Aquí, los números mayor y menor de /dev/ide/host0/bus0/target0/lun0/disc son 3 y 0, mientras que para /dev/printers/0 son 6 y 0. Note que estos números son únicos por categoría de archivo, lo que significa que puede haber un archivo de modo caracter con 3 por mayor y 0 por menor (de hecho, este archivo existe: /dev/pty/s0), y similarmente sólo puede haber un archivo de modo bloque con 6 por mayor y 0 por menor. Estos números existen por una razón simple: le permiten al núcleo asociar las operaciones adecuadas para estos archivos (es decir, con los periféricos a los cuales se refieren estos archivos): no se controla a una disquetera de la misma manera que, digamos, a un disco rígido SCSI.