2011-09-22 10 views
6

Cada proceso tiene una tabla de descriptores de archivos (FDT) y cada archivo tiene un descriptor de archivos. Los descriptores de archivo para stdin, stdout y stderr son 0,1 y 2. Estos valores son los mismos para todos los procesos. El FDT creo que contiene referencias a las entradas INODE de esos archivos. Los descriptores de archivo se reutilizan en todos los procesos, es decir, no son globalmente únicos. ¿Hay un FDT global mantenido por kernel al que hace referencia cada FDT de proceso? ¿A qué se corresponden FDT para stdin, stdout y stderr? ¿Están estos archivos especiales vinculados al teclado, pantalla, etc. Proporcione enlaces a artículos, libros, etc.Ayuda con los descriptores de archivos en Unix

Respuesta

7

Un buen punto de partida es el artículo "A small trail through the Linux kernel" de 2001. Los mecanismos siguen siendo similares, aunque la implementación ha avanzado y se estudia mejor en a more recent kernel.

Dentro del kernel cada descriptor de archivo abierto corresponde a un struct file, que contiene toda la información sobre el archivo o dispositivo abierto. El descriptor de archivo no es más que un índice en el FDT para el proceso. En el kernel de Linux, el struct file está conectado al FDT mediante la función fd_install(). El struct file se puede reasignar a otro descriptor de archivo mediante el dup2 system call.

Los procesos pueden compartir el mismo FDT si los procesos fueron creados por la llamada al sistema clone con el indicador CLONE_FILES, pero no hay un FDT global. La operación normal fork crea un nuevo FDT que es una copia del FDT padre. El uso práctico de esto es que cada subproceso de una aplicación multihebra sea un proceso clonado que comparte un FDT común, asegurando que todos los subprocesos puedan usar los mismos descriptores de archivos enteros. Si crea un nuevo proceso usando fork/exec, el nuevo proceso comienza con los mismos descriptores de archivo pero puede abrir y cerrar archivos sin afectar al elemento primario.

Las entradas de FDT para stdin, stdout, stderr se heredan del padre. No hay nada especial acerca de la implementación de kernel de estas tres entradas FDT; su significado proviene del uso convencional de la biblioteca C. El proceso principal solo decide a qué están conectados. Se pueden conectar a dispositivos de caracteres, o pueden haberse conectado a archivos o a tuberías. Para el caso del dispositivo de personaje, lo más normal es ser un dispositivo tty o pty. El libro gratis Linux Device Drivers tiene a good overview de estos.

+1

Al final del párrafo 3, creo que quiere decir que un proceso secundario puede abrir y cerrar archivos * sin * afectar al padre –

Cuestiones relacionadas