En los sistemas operativos de computadoras Unix y similares a Unix , un descriptor de archivo ( FD , con menor frecuencia fildes ) es un identificador único de proceso ( identificador ) para un archivo u otro recurso de entrada/salida , como una tubería o un socket de red .
Los descriptores de archivos generalmente tienen valores enteros no negativos ; los valores negativos se reservan para indicar "ningún valor" o condiciones de error.
Los descriptores de archivos son parte de la API POSIX . Cada proceso Unix (excepto quizás los daemons ) debería tener tres descriptores de archivos POSIX estándar, correspondientes a los tres flujos estándar :
Valor entero | Nombre | < unistd.h > constante simbólica [1] | < stdio.h > secuencia de archivos [2] |
---|---|---|---|
0 | Entrada estándar | Número de archivo estándar | entrada estándar |
1 | Salida estándar | Número de archivo de salida estándar | salida estándar |
2 | Error estándar | Número de archivo STDERR_ | error estándar |
En la implementación tradicional de Unix, los descriptores de archivos se indexan en un índice por proceso.tabla de descriptores de archivos mantenida por el núcleo, que a su vez indexa en una tabla de todo el sistema de archivos abiertos por todos los procesos, llamadatabla de archivos . Esta tabla registra elmodoen que se ha abierto el archivo (u otro recurso): para lectura, escritura, adición y posiblemente otros modos. También se indexa en una tercera tabla llamadatabla de inodosque describe los archivos subyacentes reales.[3] Para realizar la entrada o salida, el proceso pasa el descriptor de archivo al núcleo a través de unallamada al sistema, y el núcleo accederá al archivo en nombre del proceso. El proceso no tiene acceso directo a las tablas de archivos o inodos.
En Linux , se puede acceder al conjunto de descriptores de archivos abiertos en un proceso a través de path /proc/PID/fd/
, donde PID es el identificador del proceso . Los descriptores de archivos /proc/PID/fd/0
son stdin
, /proc/PID/fd/1
is stdout
y /proc/PID/fd/2
is stderr
. Como atajo a estos, cualquier proceso en ejecución también puede acceder a sus propios descriptores de archivos a través de las carpetas /proc/self/fd
y /dev/fd
. [4]
En sistemas tipo Unix , los descriptores de archivos pueden hacer referencia a cualquier tipo de archivo Unix nombrado en un sistema de archivos. Además de los archivos normales, esto incluye directorios , dispositivos de bloques y caracteres (también llamados "archivos especiales"), sockets de dominio Unix y canalizaciones con nombre . Los descriptores de archivos también pueden hacer referencia a otros objetos que normalmente no existen en el sistema de archivos, como canalizaciones anónimas y sockets de red .
La estructura de datos FILE de la biblioteca de E/S estándar de C suele incluir un descriptor de archivo de bajo nivel para el objeto en cuestión en sistemas tipo Unix. La estructura de datos general proporciona una abstracción adicional y se conoce como identificador de archivo .
A continuación se enumeran las operaciones típicas sobre descriptores de archivos en sistemas modernos similares a Unix . La mayoría de estas funciones se declaran en el <unistd.h>
encabezado, pero algunas se encuentran en el <fcntl.h>
encabezado.
La función fcntl() se utiliza para realizar varias operaciones en un descriptor de archivo, según el argumento del comando que se le pase. Hay comandos para obtener y establecer atributos asociados con un descriptor de archivo, incluidos F_GETFD, F_SETFD, F_GETFL y F_SETFL .
at
operaciones de sufijoSe ha añadido una serie de nuevas operaciones a muchos sistemas modernos similares a Unix, así como a numerosas bibliotecas de C, que se estandarizarán en una versión futura de POSIX . [7] El at
sufijo significa que la función toma un primer argumento adicional que proporciona un descriptor de archivo a partir del cual se resuelven las rutas relativasat
, por lo que las formas que carecen del sufijo se vuelven equivalentes a pasar un descriptor de archivo correspondiente al directorio de trabajo actual . El propósito de estas nuevas operaciones es defenderse contra una cierta clase de ataques TOCTOU .
Los descriptores de archivos de Unix se comportan de muchas maneras como capacidades . Se pueden pasar entre procesos a través de sockets de dominio Unix utilizando la sendmsg()
llamada al sistema. Sin embargo, tenga en cuenta que lo que realmente se pasa es una referencia a una "descripción de archivo abierto" que tiene un estado mutable (el desplazamiento del archivo y los indicadores de acceso y estado del archivo). Esto complica el uso seguro de los descriptores de archivos como capacidades, ya que cuando los programas comparten el acceso a la misma descripción de archivo abierto, pueden interferir con el uso que hacen los demás al cambiar su desplazamiento o si es bloqueante o no bloqueante, por ejemplo. [8] [9] En los sistemas operativos que están diseñados específicamente como sistemas de capacidades, rara vez hay un estado mutable asociado con una capacidad en sí.
La tabla de descriptores de archivos de un proceso Unix es un ejemplo de una lista C.