5. 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 Linux decida ejecutar la escritura en el hardware. Por supuesto, se puede obviar este comportamiento de ser necesario, para cierto sistema de archivos. Eche un vistazo a las opciones sync y async en la página Man mount(8) y también consulte Sección 7, “Los atributos de los archivos” para más detalles.

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/hdc /dev/lp0 
brw-rw----  1 reina cdrom 22, 0 Feb 23 19:18 /dev/hdc
crw-rw----  1 root root 6, 0 Feb 23 19:17 /dev/lp0

Aquí, los números mayor y menor de /dev/hdc son 22 y 0, mientras que para /dev/lp0 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 22 por mayor y 0 por menor, 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.