Los descriptores de archivos son parte de la API POSIX . Cada proceso Unix (excepto quizás los demonios ) debe tener tres descriptores de archivos POSIX estándar, correspondientes a los tres flujos estándar :
Descripción general
En la implementación tradicional de Unix, los descriptores de archivos se indexan en un proceso por proceso.tabla de descriptores de archivos mantenida por el kernel, que a su vez indexa en una tabla de archivos abiertos por todos los procesos, llamada tabla de descriptores de archivos de todo el sistema.tabla de archivos . Esta tabla registra elmodocon el que se abrió el archivo (u otro recurso): para leer, escribir, agregar y posiblemente otros modos. También indexa en una tercera tabla llamadatabla de inodosque describe los archivos subyacentes reales.[3] Para realizar entrada o salida, el proceso pasa el descriptor del archivo al kernel a través de unallamada al sistema, y el kernel accederá al archivo en nombre del proceso. El proceso no tiene acceso directo al archivo ni a las tablas de inodos.
En Linux , se puede acceder al conjunto de descriptores de archivos abiertos en un proceso mediante la ruta /proc/PID/fd/, donde PID es el identificador del proceso . El descriptor del archivo /proc/PID/fd/0es stdin, /proc/PID/fd/1es stdouty /proc/PID/fd/2es stderr. Como acceso directo 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/fdy /dev/fd. [4]
La estructura de datos FILE en la biblioteca de E/S estándar de C generalmente incluye 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, en cambio, se la conoce como identificador de archivo .
Operaciones sobre descriptores de archivos.
A continuación se enumeran operaciones típicas en descriptores de archivos en sistemas modernos tipo Unix . La mayoría de estas funciones se declaran en el <unistd.h>encabezado, pero algunas están en el <fcntl.h>encabezado.
Operaciones en la tabla de descriptores de archivos.
La función fcntl() se utiliza para realizar varias operaciones en un descriptor de archivo, dependiendo del 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 .
closefrom() (solo BSD y Solaris; elimina todos los descriptores de archivos mayores o iguales al número especificado)
close_range() (para Linux) [6]
dup() (duplica un descriptor de archivo existente garantizando que será el descriptor de archivo con el número más bajo disponible)
dup2 () , dup3() (Cierre fd1 si es necesario y haga que el descriptor de archivo fd1 apunte al archivo abierto de fd2)
fcntl (F_DUPFD)
Operaciones que modifican el estado del proceso.
fchdir() (establece el directorio de trabajo actual del proceso basándose en un descriptor de archivo de directorio)
mmap () (asigna rangos de un archivo al espacio de direcciones del proceso)
Bloqueo de archivos
rebaño()
fcntl() (F_GETLK, F_SETLK y F_SETLKW)
bloqueof()
Enchufes
conectar()
unir()
escuchar()
aceptar() (crea un nuevo descriptor de archivo para una conexión entrante)
obtiene nombre de archivo()
getpeername()
obtienesockopt()
conjuntosockopt()
Shutdown() (apaga una o ambas mitades de una conexión full duplex)
Misceláneas
ioctl() (una gran colección de operaciones diversas en un único descriptor de archivo, a menudo asociado con un dispositivo)
Próximas operaciones
Se ha agregado una serie de nuevas operaciones sobre descriptores de archivos a muchos sistemas modernos tipo Unix, así como a numerosas bibliotecas C, que se estandarizarán en una versión futura de POSIX . [7] El atsufijo 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 los formularios que carecen del sufijo equivalen a pasar un descriptor de archivo correspondiente al directorio de trabajo actual . El propósito de estas nuevas operaciones es defenderse contra una determinada clase de ataques TOCTOU .
abrir()
acceso directo()
fchmodat()
fchownat()
fstatat()
futimesat()
enlazar()
mkdirat()
mknodat()
leerenlace()
cambiar nombre()
enlace simbólico()
desvincular()
mkfifoat()
fdopendir()
Descriptores de archivos como capacidades
Los descriptores de archivos Unix se comportan de muchas maneras como capacidades . Se pueden pasar entre procesos a través de sockets de dominio Unix mediante 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 el estado del archivo y los indicadores de acceso). 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 cambiando su compensación 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 lista C.
^ El grupo abierto . "Especificaciones básicas de Open Group, edición 7, norma IEEE 1003.1-2008, edición de 2016" . Consultado el 21 de septiembre de 2017 .
^ El grupo abierto. "Especificaciones básicas de Open Group, edición 7, norma IEEE 1003.1-2008, edición de 2016". <stdio.h> . Consultado el 21 de septiembre de 2017 .
^ ab Bach, Maurice J. (1986). El diseño del sistema operativo UNIX (8 ed.). Prentice Hall . págs. 92–96. ISBN9780132017992.
^ "Dispositivos: ¿Qué significa la salida de 'll /Proc/Self/Fd/' (de 'll /Dev/Fd')?".
^ El grupo abierto . "Especificaciones básicas de Open Group, edición 7, norma IEEE 1003.1-2008, edición 2018 - creat" . Consultado el 11 de abril de 2019 .
^ Stephen Kitt, Michael Kerrisk. "close_range(2) — Página del manual de Linux" . Consultado el 22 de marzo de 2021 .
^ Conjunto de API ampliado, parte 2 . El grupo abierto. Octubre de 2006. ISBN1931624674.
^ Brinkmann, Marcus (4 de febrero de 2009). "Construyendo un puente: ¿API de biblioteca y descriptores de archivos?". charla de gorras . Archivado desde el original el 30 de julio de 2012 . Consultado el 21 de septiembre de 2017 .
^ de Boyne Pollard, Jonathan (2007). "No configure los descriptores de archivos compartidos en modo de E/S sin bloqueo" . Consultado el 21 de septiembre de 2017 .