$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty 136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim 64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
- Me preguntaba si todos los archivos
/dev
y sus subdirectorios son todos descriptores de archivos de dispositivos.
- ¿Por qué hay tantos enlaces entre sí? Por ejemplo,
/dev/fd/0
,
/dev/stdin
, /proc/self/fd/0
son todos los enlaces a /dev/pts/2
.
- Si
l
en lrwx------
el enlace medio, ¿qué significa c
en crw--w----
?
Respuestas:
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 dels -l
) y dispositivos de caracteres (indicados porc
). 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 , obsoletasMAKEDEV
.¹ Esto ya no es cierto en Linux, pero este detalle solo es importante para los escritores de controladores de dispositivos.
fuente
ls -l
lista donde normalmente encuentra el tamaño del archivo, antes de la fecha, por ejemplo,brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ este dispositivo es mayor 8, menor 0. Los números de dispositivo no aparecen con frecuencia en la práctica, solo los mencioné para decir lo que hace que un dispositivo sea un dispositivo (lo más importante, no es el nombre del archivo). Un número de descriptor de archivo solo tiene un significado en un proceso particular./dev/stdin
(=>/proc/self/fd/0
) en Linux no tiene el mismo efecto que duplicar la entrada estándar. Para ver la diferencia,su - non_root_user
entoncesexec 5</dev/stdin
fallará con "Permiso denegado", peroexec 5<&0
tendrá éxito. Y no es sólo que el nuevo fd se abrirá con diferentes banderas, todo lo relacionado con el objeto de archivo ( "descrip archivo abierto ción " en la jerga de POSIX) será diferente (archivo puntero de desplazamiento / modo, no bloqueo, etc)./dev/
./dev/stdin
. Esto no apunta estáticamente a/dev/pts/2
ningún otro, simplemente cambie a otro terminal y verá./dev/stdin
es la entrada estándar de su sesión de terminal actual . Ese también es un ejemplo de por qué debe ser un enlace simbólico.man mknod
yinfo coreutils 'mknod invocation'
. En general,c
significa un tipo de dispositivo de personaje.fuente
/dev/stdin
se refiere a la entrada estándar del proceso que lo abrirá. Todo/proc/$pid
lo que contiene son datos dependientes del proceso, y/proc/self
es una especie de enlace mágico que apunta a los datos del proceso.Para su primera pregunta, no son descriptores de archivo, son archivos de dispositivo. (también conocido como "nodos de desarrollo")
Esos archivos están vinculados con el controlador que maneja el dispositivo usando números mayores y menores. (Por ejemplo, "136, 2" en su
ls
salida se refiere al controlador del dispositivo vinculado al número mayor 136, y especifica el dispositivo # 2 manejado por ese controlador).La primera letra de salida
ls -l
es el tipo de dispositivo en el caso de los archivos del dispositivo. Si es 'c' es un dispositivo de caracteres, o si es 'b', es un dispositivo de bloque.Para su segunda pregunta, consulte la respuesta anterior de rozcietrzewiacz.
fuente