¿Cuál sería una descripción más simplificada de descriptores de archivos en comparación con la de Wikipedia? ¿Por qué se requieren? Digamos, tome los procesos de shell como ejemplo y ¿cómo se aplica?
¿Una tabla de proceso contiene más de un descriptor de archivo? ¿Si es así por qué?
unix
operating-system
file-descriptor
Nishant
fuente
fuente
Respuestas:
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 núcleo). Estas entradas están representadas por enteros como (... 100, 101, 102 ....). Este número de entrada es el descriptor de 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, su tabla de Proceso tendrá 10 entradas para los descriptores de archivo.
De manera similar, cuando abre un socket de red, también está representado por un número entero y se llama Socket Descriptor. Espero que entiendas.
fuente
/proc
todo el tiempo.open()
le dará el descriptor de archivo 3, incluso si otro proceso en ejecución tiene un descriptor de archivo 3. Vea la definición POSIX deopen()
: "La función open () devolverá un descriptor de archivo para el archivo nombrado que es el más bajo el descriptor de archivo no está abierto actualmente para ese proceso ". (énfasis añadido).Un descriptor de archivo es un identificador opaco que se usa en la interfaz entre el usuario y el espacio del núcleo para identificar los recursos de archivo / socket. Por lo tanto, cuando usa
open()
osocket()
(el sistema llama a la interfaz con el núcleo), se le da un descriptor de archivo, que es un número entero (en realidad es un índice de la estructura de procesos u, pero eso no es importante). Por lo tanto, si desea interactuar directamente con el núcleo, usando las llamadas al sistema aread()
,write()
,close()
etc el mango que se utiliza es un descriptor de archivo.Hay una capa de abstracción superpuesta en las llamadas al sistema, que es la
stdio
interfaz. Esto proporciona más funciones / características que las llamadas básicas del sistema. Para esta interfaz, el identificador opaco que obtienes es unFILE*
, que es devuelto por lafopen()
llamada. Hay muchas muchas funciones que utilizan lastdio
interfazfprintf()
,fscanf()
,fclose()
, que están ahí para hacer su vida más fácil. En C,stdin
,stdout
, ystderr
sonFILE*
, en la que UNIX mapa, respectivamente, a los descriptores de fichero0
,1
y2
.fuente
Escuche de boca de caballo: APUE (Richard Stevens).
Para el kernel, todos los archivos abiertos son referidos por File Descriptors. 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 descriptores de archivo es generalmente secuencial y se asignan al archivo como el siguiente descriptor de archivo libre del conjunto de descriptores de archivo libre. Cuando cerramos el archivo, el descriptor del archivo se libera y está disponible para su posterior asignación.
Vea esta imagen para más detalles:
Cuando deseamos leer o escribir un archivo, identificamos el archivo con el descriptor de archivo que fue devuelto por la función open () o create () , y lo usamos como argumento para leer () o escribir () .
Por convención, los 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 descriptor de archivo 2 con error estándar .
El descriptor de archivo varía de 0 a OPEN_MAX. El valor máximo del descriptor de archivo se puede obtener con
ulimit -n
. Para obtener más información, consulte el tercer capítulo del Libro APUE.fuente
osqueryi <<< echo '.all process_open_files'
en un shell bash.Otras respuestas agregaron cosas geniales. Agregaré solo mis 2 centavos.
Según Wikipedia, estamos seguros: un descriptor de archivo es un número entero no negativo. Lo más importante que creo que falta es decir:
Los descriptores de archivo están vinculados a una ID de proceso.
Sabemos que los descriptores de archivos más famosos son 0, 1 y 2. 0 corresponde a
STDIN
, 1 aSTDOUT
y 2 aSTDERR
.Mira este código
Creamos un proceso con el id 14726 (PID). Usando el
lsof -p 14726
podemos obtener cosas como esta:La 4ª columna FD y la siguiente columna TYPE corresponden al descriptor de archivo y al tipo de descriptor de archivo.
Algunos de los valores para el FD pueden ser:
Pero el descriptor de archivo real está debajo:
El carácter después del número, es decir, "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 de archivo. Algunos de los valores de TYPE son:
Pero todos los descriptores de archivo son CHR: archivo especial de caracteres (o archivo de dispositivo de caracteres)
Ahora, podemos identificar los Descriptores de archivos para
STDIN
,STDOUT
ySTDERR
fácil conlsof -p PID
, o podemos ver lo mismo si lo hacemosls /proc/PID/fd
.Tenga en cuenta también que la tabla de descriptores de archivos que el núcleo realiza un seguimiento no es la misma que la tabla de archivos o la tabla de inodes. Estos están separados, como explicaron algunas otras respuestas.
Puede preguntarse dónde están físicamente estos descriptores de archivos y qué se almacena,
/dev/pts/6
por ejemplo,Bueno,
/dev/pts/6
vive puramente en la memoria. Estos no son archivos normales, sino los llamados archivos de dispositivos de caracteres . Puede verificar esto con:ls -l /dev/pts/6
y comenzarán conc
, en mi casocrw--w----
.Solo para recordar que la mayoría de Linux como SO define siete tipos de archivos:
fuente
Más puntos con respecto a
File Descriptor
:File Descriptors
(FD) son enteros no negativos(0, 1, 2, ...)
que están asociados con los archivos que se abren.0, 1, 2
son FD estándar que corresponden aSTDIN_FILENO
,STDOUT_FILENO
ySTDERR_FILENO
(definidos enunistd.h
) se abren por defecto en nombre del shell cuando se inicia el programa.Los FD se asignan en el orden secuencial, lo que significa el valor entero sin asignar más bajo posible.
Los FD para un proceso particular se pueden ver en
/proc/$pid/fd
(en sistemas basados en Unix).fuente
Como una adición a otras respuestas, Unix considera todo como un sistema de archivos. Su teclado es un archivo que se lee solo 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, digamos que cuando los controladores de dispositivo [para archivos de dispositivo] solicitan un open (), o un proceso abre un archivo de usuario, el núcleo asigna un descriptor de archivo, un número entero que especifica el acceso a ese archivo para que sea de solo lectura , escriba solo etc. [para referencia: https://en.wikipedia.org/wiki/Everything_is_a_file ]
fuente
Descriptores de archivo (FD):
Redirección de errores:
cada vez que ejecuta un programa / comando en la terminal, siempre hay 3 archivos abiertos
Estos archivos siempre están presentes cuando 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
Entrada estándar STDIN 0
Salida estándar STDOUT 1
Error estándar STDERR 2
Ejemplo 1
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>" redirigiremos la salida del error a un archivo llamado "errorfile". txt "
Por lo tanto, la salida del programa no está llena de errores.
Espero que hayas recibido tu respuesta.
fuente
Cualquier sistema operativo tiene procesos (p's) 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 otra frase).
Por lo general, 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 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 archivos suelen ser 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, se 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 archivo, pero este caso es extremadamente raro, y el usuario promedio de la computadora no debería preocuparse por eso.
Los descriptores de archivo pueden ser globales (el proceso A comienza en decir 0 y termina en 1; el proceso B comienza en 2 y termina en 3) y así sucesivamente, pero hasta donde yo sé, generalmente en los sistemas operativos modernos, el archivo los descriptores no son globales, y en realidad son específicos del proceso (el proceso A comienza en digamos 0 y finaliza en 5, mientras que el proceso B comienza en 0 y finaliza en 10).
fuente
Descriptores de archivo
fuente
Además de sobre todo las respuestas simplificadas.
Si está trabajando con archivos en script bash, es mejor usar el descriptor de archivos.
Por ejemplo: -
Desea leer y escribir desde / al archivo "test.txt".
Use el descriptor de archivo como se muestra a continuación
fuente
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.
fuente