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


  1. ¿Qué sería una descripción más simplificada de los descriptores de archivo en comparación con la de Wikipedia? ¿Por qué se requieren? Digamos, tomar procesos de shell como ejemplo y cómo se aplica para ello?

  2. Una tabla de procesos contiene más de un descriptor de archivo. En caso afirmativo, ¿por qué?

Author: Bhesh Gurung, 2011-03-10

10 answers

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. Así que si hay 100 archivos abiertos en su sistema operativo, entonces habrá 100 entradas en el sistema operativo (en algún lugar del núcleo). Estas entradas están representadas por enteros como (...100, 101, 102....). Este número de entrada es el descriptor de fichero. Por lo tanto, es solo un número entero que representa de forma única un archivo abierto en el sistema operativo. Si el proceso abre 10 archivos entonces su tabla de procesos tendrá 10 entradas para descriptores de archivo.

Del mismo modo, cuando se abre un socket de red, también está representado por un entero y se llama Descriptor de Socket. Espero que lo entiendas.

 423
Author: Tayyab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-19 22:55:01

Un descriptor de archivo es un identificador opaco que se utiliza en la interfaz entre el usuario y el espacio del núcleo para identificar los recursos de archivo/socket. Por lo tanto, cuando se utiliza open() o socket() (llamadas al sistema a la interfaz con el núcleo), 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 núcleo, utilizando llamadas al sistema para read(), write(), close() etc. el mango 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 al sistema. Para esta interfaz, el identificador opaco que obtienes es un FILE*, que es devuelto por la llamada fopen(). Hay muchas muchas funciones que utilizan la interfaz stdiofprintf(), 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 respectivamente mapean a file descriptores 0, 1 y 2.

 85
Author: Beano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-22 05:29:42

Hear it from the Horse's Mouth: APUE (Richard Stevens).
Para el núcleo, todos los archivos abiertos son referidos por Descriptores de archivo. Un descriptor de fichero 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 archivo abiertos, que están en uso. La asignación de descriptores de archivo es generalmente secuencial y se asignan al archivo como el siguiente libre descriptor de fichero del pool de descriptores de fichero libres. Cuando cerramos el archivo, el descriptor de archivo se libera y está disponible para más asignaciones.
Ver esta imagen para más detalles :
Dos Procesos

Cuando queremos leer o escribir un archivo, podemos identificar el archivo con el descriptor de archivo que fue devuelto por abrir() o crear() la función de llamada, y utilizar como un argumento a read() o write().
Es por convención que, UNIX System shells asocia el descriptor de archivo 0 con Entrada estándar de un proceso, el descriptor de archivo 1 con Salida estándar, y el descifrador de archivo 2 con Error Estándar.
El descriptor de archivo varía de 0 a OPEN_MAX.
Para obtener más información, consulte el 3er capítulo del libro APUE.

 78
Author: Shekhar Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-07 21:25:41

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

 13
Author: Balu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-24 03:58:37

Más puntos respecto a 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 estándar FD ' s que corresponde a STDIN_FILENO, STDOUT_FILENO y STDERR_FILENO (definido en unistd.h) se abre por defecto en nombre del shell cuando se inicia el programa.

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

  4. FD de a proceso particular se puede ver en /proc/$pid/fd (en sistemas basados en Unix).

 11
Author: Sandeep_black,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-06 19:09:04

Cualquier sistema operativo tiene procesos (p) en ejecución, por ejemplo p1, p2, p3 y así sucesivamente. Cada proceso generalmente hace un uso continuo de archivos.

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

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

El primer archivo utilizado en el proceso es file0 , el segundo es file1 , el tercero es file2 , y así sucesivamente.

Cualquier número de este tipo es un descriptor de archivo.

Los descriptores de archivo suelen ser enteros (0, 1, 2 y no 0.5, 1.5, 2.5).

Dado que a menudo describimos 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 se abre un socket de red, tiene un descriptor de socket.

En algunas operaciones sistemas, puede quedarse sin descriptores de archivo, pero tal caso es extremadamente raro, y el usuario promedio de computadora no debería preocuparse por eso.

Los descriptores de archivo pueden ser globales (el proceso A comienza por ejemplo en 0, y termina por ejemplo en 1 ; el proceso B comienza por ejemplo en 2, y termina por ejemplo en 3) y así sucesivamente, pero hasta donde sé, generalmente en los sistemas operativos modernos, los descriptores de archivo no son globales, y en realidad son específicos del proceso (el proceso A comienza por ejemplo en 0 y termina por ejemplo en 5, mientras que el proceso B comienza por 0 y termina decir en 10).

 3
Author: JohnDoea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-21 04:17:39

Otras respuestas agregaron grandes cosas. Voy a añadir sólo mis 2 centavos.

Según Wikipedia sabemos con certeza: un descriptor de archivo es un entero no negativo. Lo más importante que creo que falta, sería decir:

Los descriptores de archivo están vinculados a un ID de proceso.

Sabemos que los descriptores de archivo más famosos son 0, 1 y 2. 0 corresponde a STDIN, 1 a STDOUT, y 2 a STDERR.

Digamos, toma los procesos de shell como ejemplo y cómo lo hace ¿solicitarlo?

Echa un vistazo a este código

#>sleep 1000 &
[12] 14726

Creamos un proceso con el id 14726 (PID). Usando el lsof -p 14726 podemos obtener cosas como esta:

COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
sleep   14726 root  cwd    DIR    8,1     4096 1201140 /home/x
sleep   14726 root  rtd    DIR    8,1     4096       2 /
sleep   14726 root  txt    REG    8,1    35000  786587 /bin/sleep
sleep   14726 root  mem    REG    8,1 11864720 1186503 /usr/lib/locale/locale-archive
sleep   14726 root  mem    REG    8,1  2030544  137184 /lib/x86_64-linux-gnu/libc-2.27.so
sleep   14726 root  mem    REG    8,1   170960  137156 /lib/x86_64-linux-gnu/ld-2.27.so
sleep   14726 root    0u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    1u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    2u   CHR  136,6      0t0       9 /dev/pts/6

La 4a columna FD y el tipo de columna siguiente corresponden al Descriptor de fichero y al tipo de Descriptor de fichero.

Algunos de los valores para el FD pueden ser:

cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device

Pero el descriptor de fichero real está bajo:

NUMBER – Represent the actual file descriptor. 

El carácter después del número i. e "1u", representa el modo en que se abre el archivo. r para leer, w para escribir, u para leer y escribir.

TYPE especifica el tipo del archivo. Algunos de los valores de los tipos son:

REG – Regular File
DIR – Directory
FIFO – First In First Out

Pero todos los descriptores de archivo son CHR - Archivo especial de caracteres (o archivo de dispositivo de caracteres)

Ahora, podemos identificar los Descriptores deSTDIN, STDOUT y STDERR fácil con lsof -p PID, o podemos ver lo mismo si ls /proc/PID/fd.

Tenga en cuenta también que la tabla de descriptores de archivo a la que el kernel realiza un seguimiento no es lo mismo que tabla de archivos o tabla de inodos. Estos son separados, como algunas otras respuestas explicaron.

cuadro df

Puede preguntarse dónde están físicamente estos descriptores de archivo y qué se almacena en /dev/pts/6 por ejemplo

sleep   14726 root    0u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    1u   CHR  136,6      0t0       9 /dev/pts/6
sleep   14726 root    2u   CHR  136,6      0t0       9 /dev/pts/6

Bueno, /dev/pts/6 vive puramente en la memoria. Estos no son archivos regulares, sino los llamados archivos de dispositivos de caracteres. Puedes comprobar esto con: ls -l /dev/pts/6 y empezarán con c, en mi caso crw--w----.

Solo para recordar la mayoría de Linux como OS definir siete tipos de archivos:

  • Archivos regulares
  • Directorios
  • Archivos de dispositivos de caracteres
  • Bloquear archivos de dispositivos
  • Sockets de dominio local
  • Tuberías nombradas (FIFOs) y
  • Enlaces simbólicos
 3
Author: prosti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-29 11:38:16

Descriptores de archivo (FD) :

  • En Linux/Unix, todo es un archivo. Archivo Regular, 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 programa la salida se envía al Descriptor de archivo de la pantalla, y se ve salida del programa en su monitor. Si la salida se envía al archivo Descriptor de la impresora, la salida del programa tendría ser impreso.

    Redirección de error:
    Cada vez que ejecuta un programa / comando en el terminal, 3 archivos están siempre abiertos
    1. entrada estándar
    2. la salida estándar
    3. error estándar.

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

  • Por ejemplo, al buscar archivos, uno por lo general, obtiene errores de permiso denegado o algún otro tipo de errores. Estos errores se pueden guardar en un archivo en particular.
    Ejemplo 1

Ls ls mydir 2>errorsfile.txt

El descriptor de archivo para error estándar es 2.
Si no hay ningún directorio nombrado como mydir entonces la salida del comando se guardará en el archivo errorfile.txt
Usando "2> "redirigimos la salida de error a un archivo llamado" errorfile.txt "
Por lo tanto, la salida del programa no está llena de errores.

Espero que tengas tu respuesta.

 2
Author: Abhishek Kamal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-02 17:48:54

Descriptores de archivo

  • Para Kernel todos los archivos abiertos son referidos por descriptores de archivo.
  • Un descriptor de fichero es un entero no negativo.
  • Cuando abrimos un archivo existente o creamos un nuevo archivo, el núcleo devuelve un descriptor de archivo a un proceso.
  • Cuando queremos leer o escribir en un archivo, identificamos el archivo con el descriptor de archivo que fue retuneado por open o create, como un argumento para leer o escribir.
  • Cada proceso UNIX tiene 20 descriptores de archivo y eliminación de ti, numerados del 0 al 19 pero fue ampliado a 63 por muchos sistemas.
  • Los tres primeros ya están abiertos cuando comienza el proceso 0: La entrada estándar 1: La salida estándar 2: La salida de error estándar
  • Cuando el proceso padre bifurca un proceso, el proceso hijo hereda los descriptores de archivo del proceso padre
 1
Author: Mahendra suthar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-03 13:08:51

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

 -5
Author: Motimahal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-18 03:43:05