descriptor de archivo vs. nombre de archivo

12

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/0son todos los enlaces a /dev/pts/2. ¿Son estos cuatro descriptores de archivo o nombres de archivo?

Tim
fuente
stackoverflow.com/questions/33495283/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Respuestas:

12

Los cuatro /dev/fd/0, /dev/stdin, /proc/self/fd/0y /dev/pts/2son 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/shes equivalente a ///bin/sh, /bin/../bin/sh(suponiendo que /bines 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 por pipe) y tomas de red .

/dev/fd/0, /dev/stdiny /proc/self/fd/0son 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 llamar dup(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.

Gilles 'SO- deja de ser malvado'
fuente
@Giles Usted escribió "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" ( énfasis mío). Según tengo entendido, es simplemente un número entero como el estándar 0,1,2, etc. para stdin, stdout y stderr respectivamente. Sería números de mayor valor para los archivos normales. Lo que no entiendo de su comentario es cómo este número indica "qué hacer si el proceso solicita lectura, escritura y otras operaciones en el descriptor de archivo". . ¿Puedes por favor ampliar esto un poco?
Geek
@ Geek Una entrada en la tabla de descriptores de archivos no es un número. El número es el índice en esa tabla.
Gilles 'SO- deja de ser malvado'
@Giles gracias por aclarar mi malentendido. Lo entiendo mejor ahora. Entonces, ¿puede dar un ejemplo de parte de "qué hacer" en su respuesta? Llegué a la conclusión de que cada entrada en la tabla de descriptores de archivo nuevamente tiene un puntero a una tabla de archivo que contiene información como desplazamiento de archivo, estado del archivo, etc. Pero aún no tengo claro qué parte de "qué hacer" en su respuesta.
Geek
2

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.

Por ejemplo, / dev / fd / 0, / dev / stdin, / proc / self / fd / 0 son todos enlaces a / dev / pts / 2. ¿Son estos cuatro descriptores de archivo o nombres de 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.

rvs
fuente