Casi todos los archivos debajo /dev
son archivos de dispositivo . Mientras que leer y escribir en un archivo normal almacena datos en un disco u otro sistema de archivos, el acceso a un archivo de dispositivo se comunica con un controlador en el núcleo, que generalmente a su vez se comunica con una pieza de hardware (un dispositivo de hardware, de ahí el nombre).
Hay dos tipos de archivos de dispositivo: dispositivos de bloque (indicados por b
como el primer carácter en la salida de ls -l
) y dispositivos de caracteres (indicados por c
). La distinción entre bloque y dispositivos de caracteres no es completamente universal. Los dispositivos de bloque son cosas como discos, que se comportan como archivos grandes de tamaño fijo: si escribe un byte en un cierto desplazamiento, y luego lee desde el dispositivo en ese desplazamiento, recupera ese byte. Los dispositivos de caracteres son casi cualquier otra cosa, donde escribir un byte tiene algún efecto inmediato (por ejemplo, se emite en una línea en serie) y leer un byte también tiene algún efecto inmediato (por ejemplo, se lee desde el puerto en serie).
El significado de un archivo de dispositivo está determinado por su número, no por su nombre (el nombre es importante para las aplicaciones, pero no para el núcleo). El número es en realidad dos números: el número principal indica qué controlador es responsable de este dispositivo, y el número menor permite que un controlador maneje varios dispositivos¹. Estos números aparecen en la ls -l
lista, donde normalmente encontrará el tamaño del archivo. Por ejemplo, brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ este dispositivo es mayor 8, menor 0.
Algunos archivos de dispositivos /dev
no corresponden a dispositivos de hardware. Uno que existe en cada sistema unix es /dev/null
; escribir en él no tiene ningún efecto, y leerlo nunca devuelve ningún dato. A menudo es conveniente en los scripts de shell, cuando desea ignorar la salida de un comando ( >/dev/null
) o ejecutar un comando sin entrada ( </dev/null
). Otros ejemplos comunes son /dev/zero
(que devuelve bytes nulos e infinito ) /dev/urandom
(que devuelve bytes aleatorios e infinito ).
Algunos archivos de dispositivo tienen un significado que depende del proceso que accede a él. Por ejemplo, /dev/stdin
designa la entrada estándar del proceso actual; abrir desde tiene aproximadamente el mismo efecto que abrir el archivo original que se abrió como entrada estándar del proceso. De manera similar, /dev/tty
designa el terminal al que está conectado el proceso. En Linux, hoy en día, /dev/stdin
y los amigos no se implementan como dispositivos de caracteres, sino como enlaces simbólicos a un mecanismo más general que permite hacer referencia a cada descriptor de archivo (en lugar de solo 0, 1 y 2 según el método tradicional); por ejemplo /dev/stdin
es un enlace simbólico a /proc/self/fd/0
. Consulte ¿Cómo se relaciona / dev / fd con / proc / self / fd /? .
Encontrará una serie de enlaces simbólicos en /dev
. Esto puede ocurrir por razones históricas: un archivo de dispositivo se movió de un nombre a otro, pero algunas aplicaciones aún usan el nombre anterior. Por ejemplo, /dev/scd0
es un enlace simbólico a /dev/sr0
Linux; ambos designan el primer dispositivo de CD. Otra razón para enlaces simbólicos es la organización: en Linux, encontrará los discos duros y particiones en varios lugares: /dev/sda
y /dev/sda1
y amigos (cada disco designado por una carta arbitraria, y las particiones de acuerdo con la distribución de la partición), /dev/disk/by-id/*
(discos designados por una número de serie único), /dev/disk/by-label/*
(particiones con un sistema de archivos, designado por una etiqueta elegida por humanos); y más. Los enlaces simbólicos también se usan cuando un nombre de dispositivo genérico puede ser uno de varios; por ejemplo/dev/dvd
podría ser un enlace simbólico /dev/sr0
o podría ser un enlace /dev/sr1
si tiene dos lectores de CD y el segundo es el lector de DVD predeterminado.
Finalmente, hay algunos otros archivos que puede encontrar /dev
, por razones tradicionales. No encontrará lo mismo en todos los sistemas. En la mayoría de los dispositivos, /dev/log
es un socket que los programas usan para emitir mensajes de registro. /dev/MAKEDEV
es un script que crea entradas en /dev
. En los sistemas Linux modernos, las entradas en /dev/
son creadas automáticamente por udev , obsoletas MAKEDEV
.
¹ Esto ya no es cierto en Linux, pero este detalle solo es importante para los escritores de controladores de dispositivos.