stringtranslate.com

Descriptor de archivo

En Unix y sistemas operativos de computadora similares a Unix , un descriptor de archivo ( FD , menos frecuentemente 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 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 :

Descripción general

Descriptores de archivos para un solo proceso, tabla de archivos y tabla de inodos . Tenga en cuenta que varios descriptores de archivos pueden hacer referencia a la misma entrada de la tabla de archivos (por ejemplo, como resultado de la llamada al sistema dup [3] : 104  ) y que varias entradas de la tabla de archivos pueden, a su vez, hacer referencia al mismo inodo (si se ha abierto varias veces; la tabla todavía está simplificada porque representa los inodos por nombres de archivos, aunque un inodo puede tener varios nombres ). El descriptor de archivo 3 no hace referencia a nada en la tabla de archivos, lo que significa que se ha cerrado.

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]

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

Crear descriptores de archivos

Derivar descriptores de archivos

Operaciones en un solo descriptor de archivo

Operaciones en múltiples descriptores de archivos

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 .

Operaciones que modifican el estado del proceso.

Bloqueo de archivos

Enchufes

Misceláneas

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 .

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.

Ver también

Referencias

  1. ^ 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 .
  2. ^ 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 .
  3. ^ ab Bach, Maurice J. (1986). El diseño del sistema operativo UNIX (8 ed.). Prentice Hall . págs. 92–96. ISBN 9780132017992.
  4. ^ "Dispositivos: ¿Qué significa la salida de 'll /Proc/Self/Fd/' (de 'll /Dev/Fd')?".
  5. ^ 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 .
  6. ^ Stephen Kitt, Michael Kerrisk. "close_range(2) — Página del manual de Linux" . Consultado el 22 de marzo de 2021 .
  7. ^ Conjunto de API ampliado, parte 2 . El grupo abierto. Octubre de 2006. ISBN 1931624674.
  8. ^ 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 .
  9. ^ 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 .