Otras respuestas agregaron cosas geniales. Agregaré solo mis 2 centavos.
Según Wikipedia, estamos seguros: un descriptor de archivo es un número entero no negativo. Lo más importante que creo que falta es decir:
Los descriptores de archivo están vinculados a una ID de proceso.
Sabemos que los descriptores de archivos más famosos son 0, 1 y 2. 0 corresponde a STDIN
, 1 a STDOUT
y 2 a STDERR
.
Digamos, tome los procesos de shell como ejemplo y ¿cómo se aplica?
Mira este código
#>sleep 1000 &
[12] 14726
Creamos un proceso con el id 14726 (PID). Usando el lsof -p 14726
podemos obtener cosas como esta:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sleep 14726 root cwd DIR 8,1 4096 1201140 /home/x
sleep 14726 root rtd DIR 8,1 4096 2 /
sleep 14726 root txt REG 8,1 35000 786587 /bin/sleep
sleep 14726 root mem REG 8,1 11864720 1186503 /usr/lib/locale/locale-archive
sleep 14726 root mem REG 8,1 2030544 137184 /lib/x86_64-linux-gnu/libc-2.27.so
sleep 14726 root mem REG 8,1 170960 137156 /lib/x86_64-linux-gnu/ld-2.27.so
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
La 4ª columna FD y la siguiente columna TYPE corresponden al descriptor de archivo y al tipo de descriptor de archivo.
Algunos de los valores para el FD pueden ser:
cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device
Pero el descriptor de archivo real está debajo:
NUMBER – Represent the actual file descriptor.
El carácter después del número, es decir, "1u", representa el modo en que se abre el archivo. r para leer, w para escribir, u para leer y escribir.
TYPE especifica el tipo de archivo. Algunos de los valores de TYPE son:
REG – Regular File
DIR – Directory
FIFO – First In First Out
Pero todos los descriptores de archivo son CHR: archivo especial de caracteres (o archivo de dispositivo de caracteres)
Ahora, podemos identificar los Descriptores de archivos para STDIN
, STDOUT
y STDERR
fácil con lsof -p PID
, o podemos ver lo mismo si lo hacemos ls /proc/PID/fd
.
Tenga en cuenta también que la tabla de descriptores de archivos que el núcleo realiza un seguimiento no es la misma que la tabla de archivos o la tabla de inodes. Estos están separados, como explicaron algunas otras respuestas.
Puede preguntarse dónde están físicamente estos descriptores de archivos y qué se almacena, /dev/pts/6
por ejemplo,
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
Bueno, /dev/pts/6
vive puramente en la memoria. Estos no son archivos normales, sino los llamados archivos de dispositivos de caracteres . Puede verificar esto con: ls -l /dev/pts/6
y comenzarán con c
, en mi caso crw--w----
.
Solo para recordar que la mayoría de Linux como SO define siete tipos de archivos:
- Archivos regulares
- Directorios
- Archivos de dispositivos de caracteres
- Bloquear archivos de dispositivo
- Sockets de dominio local
- Tuberías con nombre (FIFOs) y
- Enlaces simbólicos