¿Cómo puede el mismo fd en diferentes procesos apuntar al mismo archivo?

25

Digamos que tengo el proceso 1 y el proceso 2 . Ambos tienen un descriptor de archivo correspondiente al número entero 4.

Sin embargo, en cada proceso, el descriptor de archivo 4 apunta a un archivo totalmente diferente en la tabla Abrir archivo del núcleo:

ingrese la descripción de la imagen aquí

¿Cómo es eso posible? ¿No se supone que un descriptor de archivo es el índice de un registro en la tabla Abrir archivo?

Pithikos
fuente
1
¡Buena pregunta! Supongo que los descriptores de archivo están traducidos, de modo que el fd 4en ambos procesos es relativo a su propio número de fd abiertos. Los Fd 0-2(stdin, stdout, sdterr) siempre se abren para un nuevo proceso y los números no están reservados solo para ese proceso.
@ jw013 Pensé que esto sonaba familiar. \ @Pithikos ¿Cómo es que esto no es un duplicado?
Michael Mrozek
1
Este es un diagrama pobre: ​​debe mostrar que el descriptor de archivo 4 significa la cuarta entrada [bueno, quinto, se cuenta desde cero] de la tabla de descriptores de archivo a la izquierda, no una entrada que contenga un "4". El "4" real vive en su variable de espacio de usuario que contiene el número. El diagrama en la otra pregunta es mucho mejor.
Random832
2
@ Random832 Bueno, si supiera qué diagrama es correcto, probablemente nunca habría hecho esta pregunta.
Pithikos

Respuestas:

35

El descriptor de archivo, es decir, 4en su ejemplo, es el índice en la tabla de descriptor de archivo específica del proceso , no la tabla de archivo abierto. La entrada del descriptor de archivo en sí contiene un índice de una entrada en la tabla global de archivos abiertos del núcleo, así como también indicadores de descriptor de archivo.

jw013
fuente
2
Para el registro, solo hay un "indicador de descriptor de archivo" en la mayoría de los sistemas, el indicador de cierre de ejecución. El resto del estado "por fd" (incluido el desplazamiento y el modo de acceso) forma parte de la entrada de la tabla de archivos abiertos.
Random832
24

Cada proceso tiene su propia tabla de descriptores de archivos. El descriptor de archivo 4 en el proceso 1234 puntos dentro de la tabla del proceso 1234. El descriptor de archivo 4 en proceso 5678 puntos dentro de la tabla del proceso 5678. Un caso con el que debe estar familiarizado son los descriptores de archivo 0, 1 y 2, que para cada proceso son la entrada estándar, la salida estándar y el error estándar, apuntando a donde se redirigieron.

Un proceso puede abrir el mismo archivo más de una vez. Esto puede suceder casualmente, por ejemplo, cuando la salida estándar y el error estándar de un proceso se redirigen al mismo terminal o al mismo archivo. Las entradas de la tabla de archivos subyacentes (por ejemplo, Linuxstruct file ) contienen más que información sobre el archivo; También contienen modos de apertura (por ejemplo, lectura o escritura) y otro estado (como banderas, por ejemplo, close-on-exec). Por ejemplo, un proceso puede tener un terminal abierto para leer solo en el descriptor de archivo 0 y ese mismo terminal abierto para escribir solo en el descriptor de archivo 2. Las entradas de las tablas de archivos también contienen la posición del proceso en el archivo; un proceso puede querer tener lseekdos posiciones diferentes en el mismo archivo, y así lo usaría duppara obtener dos identificadores para ese archivo.

Gilles 'SO- deja de ser malvado'
fuente
2
Esto no es del todo correcto. De acuerdo con la página del manual / especificaciones, duphace exactamente lo que dice en la lata: ambos descriptores resultantes apuntan a la misma entrada de la tabla de archivos y, por lo tanto, comparten el mismo desplazamiento. Para obtener 2 entradas de tabla de archivo diferentes, estoy bastante seguro de que necesita openel archivo dos veces.
jw013
@Gilles "El descriptor de archivo 4 en el proceso 1234 puntos dentro de la tabla del proceso 1234". ¿A qué mesa te refieres? Por lo que sé, la única tabla en el proceso es la Tabla de descriptores de archivos donde cada registro apunta a la única Tabla de archivos abiertos del núcleo .
Pithikos
Consulte unix.stackexchange.com/questions/195057/… para obtener una descripción más precisa.
Gilles 'SO- deja de ser malvado'
8

Cada proceso tiene su propia tabla de descriptores de archivos. Eso es todo.

Todo está muy bien descrito en UNIX Network Programming por Richard Stevens si desea aprenderlo en profundidad.

Michał Šrajer
fuente
¿A qué mesa te refieres?
Pithikos
1
tabla de descriptores de archivo
Michał Šrajer
7

¿Un nivel extra de indirección no solucionaría su problema? ("Todos los problemas en la programación de computadoras pueden resolverse mediante un nivel adicional de indirección", algo sabio de barba gris). Es decir, el entero pequeño en cada proceso termina como un índice en una matriz de índices de espacio de kernel por proceso en la "Tabla de archivos abiertos".

Bruce Ediger
fuente
2
La fuente sabia de barba gris es probablemente David Wheeler. Parece que también dijo: " Pero eso generalmente creará otro problema " . :)
jw013