Me preguntaba qué diferencias y relaciones hay entre los descriptores de archivo y los nombres de archivo. ¿Se utilizan todos para acceder a los archivos? Si es así, de la misma manera?
Por ejemplo, /dev/fd/0
, /dev/stdin
, y /proc/self/fd/0
son todos los enlaces a /dev/pts/2
. ¿Son estos cuatro descriptores de archivo o nombres de archivo?
Respuestas:
Los cuatro
/dev/fd/0
,/dev/stdin
,/proc/self/fd/0
y/dev/pts/2
son los nombres de archivo, como lo son/////dev/../dev/fd//0
,/bin/sh
,/etc/fstab
,/fioejfoeijf
, etc. Todos menos que el último ejemplo, es probable que sea el nombre de un archivo existente en su máquina. Un nombre de archivo es una cadena que puede designar un archivo en su sistema de archivos; bajo Linux, cualquier cadena que no contenga un byte nulo y que tenga una longitud máxima de 4096 bytes es un nombre de archivo válido. Muchos de estos nombres son equivalentes, por ejemplo,/bin/sh
es equivalente a///bin/sh
,/bin/../bin/sh
(suponiendo que/bin
es un directorio existente), etc. Todos los ejemplos que he dado hasta ahora son los nombres de archivo absolutos; También hay nombres de archivo relativos, que no comienzan con ay/
cuyo significado depende del directorio actual.La terminología que rodea los nombres de archivo no es universal; a veces "nombre de archivo" significa una ruta completa a un archivo, y a veces significa el nombre de una entrada de directorio. La terminología POSIX es " nombre de archivo " o " componente de nombre de ruta " para el nombre de una entrada de directorio y " nombre de ruta " para una ruta completa.
Un descriptor de archivo designa un archivo abierto en un proceso particular. El kernel mantiene una tabla de descriptores de archivo para cada proceso. Cada entrada en la tabla de descriptores de archivos indica qué hacer si el proceso solicita lectura, escritura y otras operaciones en el descriptor de archivos.
Los descriptores de archivo pueden corresponder a un archivo y tener un nombre asociado, pero no todos lo hacen. Para aquellos que lo hacen, el archivo puede ser un archivo normal, un directorio, un archivo de dispositivo o una tubería con nombre (también llamado FIFO) (el tipo creado por
mkfifo
); Algunos sistemas tienen más posibilidades, como enchufes y puertas Unix. Los ejemplos de descriptores de archivo que no tienen un archivo con nombre asociado incluyen tuberías (del tipo creado porpipe
) y tomas de red ./dev/fd/0
,/dev/stdin
y/proc/self/fd/0
son nombres de archivo (todos equivalentes) con un significado peculiar: todos designan el archivo al que se accede actualmente mediante el descriptor de archivo 0. Cuando un proceso abre estos, el núcleo copia la entrada con el índice 0 en la tabla de descriptores de descriptor de archivo a una nueva descriptor Abrir cualquiera de estos archivos es equivalente a llamardup(0)
. Los archivos nombrados son una forma indirecta de obtener un proceso para usar uno de sus archivos ya abiertos en lugar de abrir un nuevo archivo; son principalmente útiles para pasar la línea de comando de un programa, donde el programa espera que se abra el nombre de un archivo.fuente
Filename es solo un nombre del archivo en el sistema de archivos, nada más, es solo una cadena.
El descriptor de archivo es algún tipo de objeto, desde donde puede leer y / o escribir. Ese archivo está abierto y listo. No solo hay descriptores de archivos: stdin, stdout y stderr también son descriptores, puede escribir y leer de ellos usando absolutamente las mismas funciones que con los archivos (excepto que no puede buscar). Otros ejemplos de descriptores que no son archivos son: canalizaciones con nombre y tomas de red.
En el código, el descriptor de archivo es una variable, puntero a algo en el núcleo, que representa el objeto del archivo.
Todos estos son pseudo-archivos, que pueden ser útiles para algunos scripts o programas. Puede abrirlos y abrir () le devolvería un descriptor de archivo.
fuente