Descriptor de archivo

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar

En Unix y sistemas operativos similares a Unix, un descriptor de archivo (FD, con menos frecuencia fildes) es un identificador único de proceso. (identificador) para un archivo u otro recurso de entrada/salida, como una tubería o un enchufe de red.

Los descriptores de archivos suelen tener valores enteros no negativos, y los valores negativos se reservan para indicar "sin valor"; o condiciones de error.

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:

Valor entero Nombre No identificado.h constante simbólica Identificado.h flujo de archivo
0 Entrada estándar STDIN_FILENOstdin
1 Producción estándar STDOUT_FILENOstdout
2 Error estándar STDERR_FILENOstderr

Descripción general

Descriptores de archivos para un solo proceso, tabla de archivos y tabla de inodo. Tenga en cuenta que varios descriptores de archivos pueden referirse a la misma entrada de tabla de archivos (por ejemplo, como resultado de la llamada del sistema dup) y que múltiples entradas de tabla de archivos pueden a su vez referirse a la misma inode (si se ha abierto varias veces; la tabla sigue simplificada porque representa inodes por nombres de archivos, aunque un inodo puede tener varios nombres). Descriptor de archivo 3 no se refiere a nada en la tabla de archivos, lo que significa que ha sido cerrado.

En la implementación tradicional de Unix, los descriptores de archivos se indexan en un 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 archivos. Esta tabla registra el modo con el que se abrió el archivo (u otro recurso): para lectura, escritura, anexión y posiblemente otros modos. También indexa en una tercera tabla llamada tabla de inodos que describe los archivos subyacentes reales. Para realizar entrada o salida, el proceso pasa el descriptor del archivo al kernel a través de una llamada 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, el conjunto de descriptores de archivos abiertos en un proceso se puede acceder bajo la ruta /proc/PID/fd/, donde PID es el identificador de proceso. Descriptor de archivos /proc/PID/fd/0 es stdin, /proc/PID/fd/1 es stdout, y /proc/PID/fd/2 es stderr. Como atajo a estos, cualquier proceso de funcionamiento también puede acceder propia descriptores de archivos a través de las carpetas /proc/self/fd y /dev/fd.

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 tuberías anónimas y sockets de red.

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 encabezado <unistd.h>, pero algunas están en el encabezado <fcntl.h>.

Crear descriptores de archivos

  • open()
  • creat()
  • socket()
  • aceptar()
  • socketpair()
  • tubería()
  • epoll_create() (Linux)
  • señalfd() (Linux)
  • eventfd() (Linux)
  • timerfd_create() (Linux)
  • memfd_create() (Linux)
  • userfaultfd() (Linux)
  • fanotify_init() (Linux)
  • inotify_init() (Linux)
  • clone() (con la bandera CLONE_PIDFD, Linux)
  • pidfd_open() (Linux)
  • open_by_handle_at() (Linux)
  • kqueue() (BSD)
  • pdfork() (kFreeBSD)

Derivar descriptores de archivos

  • dirfd()
  • fileno()

Operaciones en un único descriptor de archivo

  • read(), write()
  • readv(), Writev()
  • pread(), pwrite()
  • recv(), send()
  • recvfrom(), sendto()
  • recvmsg(), sendmsg() (también utilizado para enviar FDs a otros procesos sobre una toma de dominio Unix)
  • recvmmsg(), sendmmsg()
  • lseek(), llseek
  • fstat()
  • fstatvfs()
  • fchmod()
  • fchown()
  • ftruncate()
  • fsync()
  • fdatasync()
  • fdopendir()
  • fgetxatr(), fsetxatr() (Linux)
  • flistxatr(), fremovexattr() (Linux)
  • statx (Linux)
  • setns (Linux)
  • vmsplice() (Linux)
  • pidfd_send_signal() (Linux)
  • pdkill() (kFreeBSD)
  • waitid() (con P_PIDFD ID type, Linux)
  • fdopen() (stdio función:convierte el descriptor de archivos a FILE*)
  • dprintf() (función del idioma: impresiones al descriptor del archivo)

Operaciones en varios descriptores de archivos

  • select(), pselect()
  • votación(), ppoll()
  • epoll_wait(), epoll_pwait(), epoll_pwait2() (Linux, toma un solo filedescriptor de epoll para esperar en muchos otros descriptores de archivos)
  • epoll_ctl() (para Linux)
  • kqueue() (para sistemas basados en BSD).
  • sendfile()
  • empalme(), tee() (para Linux)
  • copy_file_range() (para Linux)

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 pasa. Hay comandos para obtener y establecer atributos asociados con un descriptor de archivo, incluidos F_GETFD, F_SETFD, F_GETFL y F_SETFL.

  • close()
  • closefrom() (BSD y Solaris solamente; elimina todos los descriptores de archivos mayores o iguales al número especificado)
  • close_range() (para Linux)
  • dup() (duplica un descriptor de archivos existente que garantiza ser el número más bajo disponible descriptor de archivos)
  • dup2(), dup3() (Cerrar fd1 si es necesario, y hacer descriptor de archivos fd1 punto al archivo abierto de fd2)
  • fcntl (F_DUPFD)

Operaciones que modifican el estado del proceso

  • fchdir() (configura el directorio de trabajo actual del proceso basado en un descriptor de archivos del directorio)
  • mmap() (maps rangos de un archivo en el espacio de dirección del proceso)

Bloqueo de archivos

  • rebaño()
  • fcntl() (F_GETLK, F_SETLK y F_SETLKW)
  • lockf()

Enchufes

  • connect()
  • bind()
  • listen()
  • aceptar() (crea un nuevo descriptor de archivos para una conexión entrante)
  • getsockname()
  • getpeername()
  • getockopt()
  • setsockopt()
  • apagado() (Baja una o ambas mitades de una conexión dúplex completa)

Varios

  • ioctl() (una gran colección de operaciones diversas en un solo descriptor de archivos, 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. El sufijo at significa que la función toma un primer argumento adicional que proporciona un descriptor de archivo a partir del cual se resuelven las rutas relativas, por lo que los formularios que carecen del sufijo at se vuelven equivalentes a pasar un archivo. descriptor correspondiente al directorio de trabajo actual. El propósito de estas nuevas operaciones es defenderse contra una determinada clase de ataques TOCTOU.

  • openat()
  • faccessat()
  • fchmodat()
  • fchownat()
  • fstatat()
  • futimesat()
  • linkat()
  • mkdirat()
  • mknodat()
  • readlinkat()
  • renameat()
  • symlinkat()
  • unlinkat()
  • 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 utilizando la llamada al sistema sendmsg(). 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. En los sistemas operativos que están diseñados específicamente como sistemas de capacidades, rara vez existe un estado mutable asociado con una capacidad en sí.

Un proceso Unix' La tabla de descriptores de archivos es un ejemplo de lista C.

Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save