En los sistemas operativos Unix y similares , un descriptor de archivo ( FD , menos frecuentemente fildes ) es un identificador único de proceso ( handle ) para un archivo u otro recurso de entrada/salida , como una tubería o un socket de red .
Los descriptores de archivo suelen tener valores enteros no negativos , reservándose los valores negativos para indicar "ningún valor" o condiciones de error.
Los descriptores de archivo son parte de la API POSIX . Cada proceso Unix (excepto quizás los demonios ) debe tener tres descriptores de archivo POSIX estándar, que corresponden a los tres flujos estándar :
Descripción general

En la implementación tradicional de Unix, los descriptores de archivo 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 indexa una tercera tabla llamadatabla de inodosque describe los archivos subyacentes reales. [ 3 ] Para realizar 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 archivo abiertos en un proceso a través de la ruta /proc/PID/fd/, donde PID es el identificador del proceso . El descriptor de 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 archivo a través de las carpetas /proc/self/fdy /dev/fd. [ 4 ]
En los sistemas tipo Unix , los descriptores de archivo pueden referirse a cualquier tipo de archivo Unix con nombre en el sistema de archivos. Además de los archivos regulares, esto incluye directorios , dispositivos de bloques y caracteres (también llamados "archivos especiales"), sockets de dominio Unix y tuberías con nombre . Los descriptores de archivo también pueden referirse a otros objetos que normalmente no existen en el sistema de archivos, como tuberías anónimas y sockets de red .
La FILEestructura de datos 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 se conoce como manejador de archivo .
Operaciones con descriptores de archivo
A continuación se enumeran las operaciones típicas que se realizan con descriptores de archivo en sistemas modernos tipo Unix . La mayoría de estas funciones se declaran en el <unistd.h>encabezado, pero algunas se encuentran en <fcntl.h>otro lugar.
Creación de descriptores de archivo
- abierto ()
- crear() [ 5 ]
- enchufe()
- aceptar()
- socketpair()
- tubo()
- epoll_create() (Linux)
- signalfd() (Linux)
- eventfd() (Linux)
- timerfd_create() (Linux)
- memfd_create() (Linux)
- userfaultfd() (Linux)
- fanotify_init() (Linux)
- inotify_init() (Linux)
- clone() (con el indicador CLONE_PIDFD, Linux)
- pidfd_open() (Linux)
- open_by_handle_at() (Linux)
- kqueue() (BSD)
- pdfork() (kFreeBSD)
Derivación de descriptores de archivo
- dirfd()
- número de archivo()
Operaciones sobre un único descriptor de archivo.
- leer (), escribir ()
- readv() , writev()
- pread() , pwrite()
- recv() , send()
- recvfrom() , sendto()
- recvmsg() , sendmsg() (también se utiliza para enviar descriptores de archivo a otros procesos a través de un socket de dominio Unix)
- recvmmsg() , sendmmsg()
- lseek() , llseek()
- fstat()
- fstatvfs()
- fchmod()
- fchown()
- ftruncate()
- fsync()
- fdatasync()
- fdopendir()
- fgetxattr() , fsetxattr() (Linux)
- flistxattr() , fremovexattr() (Linux)
- statx (Linux)
- setns (Linux)
- vmsplice() (Linux)
- pidfd_send_signal() (Linux)
- pdkill() (kFreeBSD)
- waitid() (con tipo de ID P_PIDFD, Linux)
- fdopen() (función stdio: convierte el descriptor de archivo a FILE*)
- dprintf() (función stdio: imprime en el descriptor de archivo)
Operaciones con múltiples descriptores de archivo
- seleccionar() , pselect()
- encuesta() , encuesta()
- epoll_wait() , epoll_pwait() , epoll_pwait2() (Linux, toma un único descriptor de archivo epoll para esperar en muchos otros descriptores de archivo)
- epoll_ctl() (para Linux)
- kqueue() (para sistemas basados en BSD).
- enviararchivo()
- splice() , tee() (para Linux)
- copy_file_range() (para Linux)
Operaciones en la tabla de descriptores de archivo
La función fcntl() se utiliza para realizar diversas operaciones en un descriptor de archivo, dependiendo del argumento de 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 .
- cerca()
- closefrom() (solo para BSD y Solaris; elimina todos los descriptores de archivo mayores o iguales al número especificado)
- close_range() (para Linux) [ 6 ]
- dup() (duplica un descriptor de archivo existente, garantizando que sea el descriptor de archivo disponible con el número más bajo)
- 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 en función de un descriptor de archivo de directorio)
- mmap () (mapea rangos de un archivo en el espacio de direcciones del proceso)
Bloqueo de archivos
- rebaño()
- fcntl() (F_GETLK, F_SETLK y F_SETLKW)
- bloquearf()
enchufes
- conectar()
- unir()
- escuchar()
- accept() (crea un nuevo descriptor de archivo para una conexión entrante)
- obtener el nombre del calcetín()
- obtener nombre del compañero()
- getsockopt()
- setsockopt()
- shutdown() (desconecta una o ambas mitades de una conexión dúplex completa)
Misceláneas
- ioctl() (una gran colección de operaciones diversas sobre un único descriptor de archivo, a menudo asociado a un dispositivo)
atoperaciones de sufijo
Se ha añadido una serie de nuevas operaciones a muchos sistemas modernos tipo Unix, así como a numerosas bibliotecas de C, para su estandarización en una futura versión de POSIX . [ 7 ] El atsufijo indica que la función toma un primer argumento adicional que proporciona un descriptor de archivo a partir del cual se resuelven las rutas relativasat ; 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 protegerse contra una determinada clase de ataques TOCTOU .
- abrir en()
- faccessat()
- fchmodat()
- fchownat()
- fstatat()
- futimesat()
- linkat()
- mkdirat()
- mknodat()
- readlinkat()
- renombrar()
- symlinkat()
- unlinkat()
- mkfifoat()
- fdopendir()
Descriptores de archivos como capacidades
Los descriptores de archivo de Unix se comportan de muchas maneras como capacidades . Se pueden pasar entre procesos a través de sockets de dominio Unix usando 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 estado y acceso del archivo). Esto complica el uso seguro de los descriptores de archivo como capacidades, ya que cuando los programas comparten el acceso a la misma descripción de archivo abierto, pueden interferir con el uso que otros hacen de ella cambiando 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, muy rara vez hay algún estado mutable asociado con la capacidad en sí.
La tabla de descriptores de archivos de un proceso Unix es un ejemplo de una lista C.
Véase también
- fusor (Unix)
- lsof
- Bloque de control de archivos (FCB): un esquema alternativo en CP/M y versiones antiguas de DOS.
Referencias
- ↑ The Open Group . "Especificaciones básicas de The Open Group, número 7, IEEE Std 1003.1-2008, edición de 2016" . Consultado el 21 de septiembre de 2017 .
- ↑ The Open Group. "Especificaciones básicas de The Open Group, número 7, IEEE Std 1003.1-2008, edición de 2016" . <stdio.h> . Consultado el 21 de septiembre de 2017 .
- 1 2 Bach, Maurice J. (1986). El diseño del sistema operativo UNIX (8.ª ed.). Prentice-Hall . págs. 92–96 . ISBN 9780132017992.
- ↑ "Dispositivos - ¿Qué significa la salida de 'll /Proc/Self/Fd/' (desde 'll /Dev/Fd')?" .
- ↑ The Open Group . "Especificaciones base de The Open Group, número 7, IEEE Std 1003.1-2008, edición de 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 extendido, Parte 2. The Open Group. Octubre de 2006. ISBN 1931624674.
- ↑ Brinkmann, Marcus (2009-02-04). "Construyendo un puente: ¿API de bibliotecas y descriptores de archivos?" . cap-talk . Recuperado el 2017-09-21 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ de Boyne Pollard, Jonathan (2007). "No configure los descriptores de archivos compartidos en modo de E/S sin bloqueo" . Recuperado el 21 de septiembre de 2017 .
- POSIX
- Tecnología del sistema de archivos Unix