¿Qué son los descriptores de archivos, explicados en términos simples?

  1. ¿Cuál sería una descripción más simplificada de los descriptores de archivos en comparación con Wikipedia? ¿Por qué son requeridos? Diga, tome los procesos de shell como un ejemplo y cómo se aplica para ello.

  2. ¿Una tabla de proceso contiene más de un descriptor de archivo? ¿Si es así por qué?

En palabras simples, cuando abre un archivo, el sistema operativo crea una entrada para representar ese archivo y almacenar la información sobre ese archivo abierto. Entonces, si hay 100 archivos abiertos en su sistema operativo, entonces habrá 100 entradas en el sistema operativo (en algún lugar del kernel). Estas entradas están representadas por enteros como (… 100, 101, 102 ….). Este número de entrada es el descriptor del archivo. Por lo tanto, es solo un número entero que representa de forma exclusiva un archivo abierto en el sistema operativo. Si su proceso abre 10 archivos, entonces su tabla de Proceso tendrá 10 entradas para los descriptores de archivos.

Del mismo modo, cuando abre un socket de red, también se representa con un entero y se llama Socket Descriptor. Espero que entiendas.

Un descriptor de archivo es un identificador opaco que se utiliza en la interfaz entre el usuario y el espacio del kernel para identificar los recursos de archivos / sockets. Por lo tanto, cuando usa open() o socket() (llamadas al sistema para interactuar con el kernel), se le da un descriptor de archivo, que es un entero (en realidad es un índice en la estructura de procesos u, pero eso no es importante ) Por lo tanto, si desea interactuar directamente con el kernel, utilizando las llamadas al sistema para read() , write() , close() etc., el identificador que utiliza es un descriptor de archivo.

Hay una capa de abstracción superpuesta en las llamadas al sistema, que es la interfaz stdio . Esto proporciona más funcionalidad / características que las llamadas básicas del sistema. Para esta interfaz, el identificador opaco que obtiene es un FILE* , que es devuelto por la llamada fopen() . Hay muchas funciones que usan la interfaz fprintf() , fscanf() , fclose() , que están ahí para hacerte la vida más fácil. En C, stdin , stdout y stderr son FILE* , que en UNIX corresponden respectivamente a los descriptores de archivo 0 , 1 y 2 .

Escúchalo de Horse’s Mouth: APUE (Richard Stevens).
Para el kernel, los Descriptores de archivo hacen referencia a todos los archivos abiertos. Un descriptor de archivo es un número no negativo.
Cuando abrimos un archivo existente o creamos un nuevo archivo, el núcleo devuelve un descriptor de archivo al proceso. El núcleo mantiene una tabla de todos los descriptores de archivos abiertos, que están en uso. La asignación de los descriptores de archivos generalmente es secuencial y se asignan al archivo como el siguiente descriptor de archivo libre del conjunto de descriptores de archivos gratuitos. Cuando cerramos el archivo, el descriptor de archivo se libera y está disponible para una asignación adicional.
Vea esta imagen para más detalles:
Dos procesos

Cuando queremos leer o escribir un archivo, identificamos el archivo con el descriptor de archivo que fue devuelto por la llamada a función open () o create () , y lo usamos como argumento para leer () o write () .
Por convención, las shells del sistema UNIX asocian el descriptor de archivo 0 con la entrada estándar de un proceso, el descriptor de archivo 1 con salida estándar y el archivo desciptor 2 con error estándar .
El descriptor de archivo va de 0 a OPEN_MAX.
Para obtener más información, vaya al tercer capítulo de APUE Book.

Como complemento a otras respuestas, Unix considera todo como un sistema de archivos. Su teclado es un archivo que solo se lee desde la perspectiva del kernel. La pantalla es un archivo de solo escritura. Del mismo modo, las carpetas, los dispositivos de entrada-salida, etc. también se consideran archivos. Cada vez que se abre un archivo, cuando los controladores del dispositivo [para los archivos del dispositivo] solicitan abrir (), o un proceso abre un archivo de usuario, el kernel asigna un descriptor de archivo, un entero que especifica el acceso a dicho archivo, por ejemplo, de solo lectura , solo escribir, etc. [para referencia: https://en.wikipedia.org/wiki/Everything_is_a_file ]

Más puntos relacionados con el File Descriptor :

  1. File Descriptors (FD) son enteros no negativos (0, 1, 2, ...) que están asociados con archivos que se abren.

  2. 0, 1, 2 son FD estándar que corresponden a STDIN_FILENO , STDOUT_FILENO y STDERR_FILENO (definidos en unistd.h ) abiertos por defecto en nombre del shell cuando se inicia el progtwig.

  3. Los FD se asignan en orden secuencial, lo que significa el valor entero no asignado más bajo posible.

  4. Los FD para un proceso particular se pueden ver en /proc/$pid/fd (en sistemas basados ​​en Unix).

Cualquier sistema operativo tiene procesos (p) ejecutándose, digamos p1, p2, p3, etc. Cada proceso generalmente hace un uso continuo de los archivos.

Cada proceso consta de un árbol de procesos (o una tabla de procesos, en otro fraseo).

Generalmente, los sistemas operativos representan cada archivo en cada proceso por un número (es decir, en cada árbol / tabla de proceso).

El primer archivo utilizado en el proceso es el archivo 0 , el segundo es el archivo1 , el tercero es el archivo2 , y así sucesivamente.

Cualquier número es un descriptor de archivo.

Los descriptores de archivos generalmente son enteros (0, 1, 2 y no 0.5, 1.5, 2.5).

Dado que a menudo describimos los procesos como “tablas de proceso”, y dado que las tablas tienen filas (entradas) podemos decir que la celda del descriptor de archivo en cada entrada, utiliza para representar la entrada completa.

De manera similar, cuando abre un socket de red, tiene un descriptor de socket.

En algunos sistemas operativos, puede quedarse sin descriptores de archivos, pero ese caso es extremadamente raro, y el usuario promedio de la computadora no debería preocuparse por eso.

Los descriptores de archivos pueden ser globales (el proceso A comienza en decir 0, y los extremos dicen en 1; El Proceso B comienza dice en 2, y termina en 3) y demás, pero hasta donde yo sé, generalmente en sistemas operativos modernos, archivo los descriptores no son globales, y en realidad son específicos del proceso (el proceso A comienza en decir 0 y los extremos dicen en 5, mientras que el proceso B comienza en 0 y termina en 10).

Descriptores de archivo (FD):

  • En Linux / Unix , todo es un archivo. El archivo regular, los directorios e incluso los dispositivos son archivos. Cada archivo tiene un número asociado llamado Descriptor de archivo (FD).
  • Su pantalla también tiene un Descriptor de archivo. Cuando se ejecuta un progtwig, la salida se envía al Descriptor de archivo de la pantalla y se ve la salida del progtwig en su monitor. Si la salida se envía al Descriptor de archivo de la impresora, la salida del progtwig se habría impreso.

    Redirección de errores:
    Cada vez que ejecutas un progtwig / comando en la terminal, 3 archivos están siempre abiertos

    1. entrada estándar
    2. salida estándar
    3. Error estándar.

    Estos archivos están siempre presentes cada vez que se ejecuta un progtwig. Como se explicó antes, un descriptor de archivo está asociado con cada uno de estos archivos.
    Descriptor de archivo de archivo
    Entrada estándar STDIN 0
    Salida estándar STDOUT 1
    Error estándar STDERR 2

  • Por ejemplo, durante la búsqueda de archivos, uno generalmente obtiene permisos de errores denegados o algún otro tipo de errores. Estos errores se pueden guardar en un archivo en particular.
    Ejemplo 1

$ ls mydir 2> errorsfile.txt

El descriptor de archivo para el error estándar es 2.
Si no hay ningún directorio llamado mydir, la salida del comando se guardará en el archivo errorfile.txt
Usando “2>” volvemos a dirigir el resultado del error a un archivo llamado “errorfile.txt”
Por lo tanto, la salida del progtwig no está llena de errores.

Espero que tengas tu respuesta.

Los descriptores de archivo son los descriptores de un archivo. Dan enlaces a un archivo. Con la ayuda de ellos podemos leer, escribir y abrir un archivo.

Intereting Posts