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:
¿Cómo es eso posible? ¿No se supone que un descriptor de archivo es el índice de un registro en la tabla Abrir archivo?
kernel
open-files
file-descriptors
Pithikos
fuente
fuente
4
en ambos procesos es relativo a su propio número de fd abiertos. Los Fd0-2
(stdin, stdout, sdterr) siempre se abren para un nuevo proceso y los números no están reservados solo para ese proceso.Respuestas:
El descriptor de archivo, es decir,
4
en 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.fuente
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, Linux
struct 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 tenerlseek
dos posiciones diferentes en el mismo archivo, y así lo usaríadup
para obtener dos identificadores para ese archivo.fuente
dup
hace 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 necesitaopen
el archivo dos veces.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.
fuente
¿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".
fuente