Estoy tratando de obtener la imagen completa con descriptores de archivo. Digamos que tengo process1 que inicialmente tiene estos descriptores de archivo:
_process1_
| |
| 0 stdin |
| 1 stdout |
| 2 stderr |
|__________|
Luego cierro el descriptor de archivo 1:
close(1);
El descriptor de archivo 1 se traduce (puntos) a la estructura de archivo estándar en la tabla de archivos abiertos del núcleo .
Con el código anterior, el descriptor de archivo 1 se elimina de la tabla del proceso que se convierte en:
_process1_
| |
| 0 stdin |
| 2 stderr |
|__________|
¿Pero qué pasa en el núcleo? ¿La stdout
estructura FILE se desasigna? ¿Cómo es eso posible si stdout es un archivo especial (el monitor) y probablemente sea utilizado por otros procesos? ¿Qué pasa con las estructuras de ARCHIVO que son solo archivos normales (.txt, por ejemplo)? ¿Qué sucede si dicho archivo está siendo utilizado por otro proceso?
fuente
open
éxito.En este caso no sucederá mucho. stdin, stdout y stderr tienden a ser clones del mismo descriptor de archivo. El contador de referencia para el descriptor de archivo se reducirá en uno. El mismo descriptor de archivo generalmente se encuentra en el shell desde el que se ejecutó el programa, por lo que debe mantenerse el descriptor de archivo.
El núcleo mantiene recuentos de referencia para todos los archivos (inodos) que están abiertos. Mientras el recuento de referencia sea mayor que cero, el archivo se mantendrá. Esperaría que se mantenga un contador separado para los identificadores de archivos abiertos. Una vez que esto llega a cero, el núcleo puede liberar la memoria utilizada por el identificador de archivo.
Cuando se hayan eliminado todas las referencias al archivo (entradas de directorio y identificadores de archivo), el código del sistema de archivos marcará el inodo para su reutilización. Cualquier bloque que tenga el archivo estará disponible para su asignación. Muchos sistemas de archivos borrarán los punteros de bloque en el inodo cuando se libere. Esto dificulta la recuperación de un archivo eliminado. Las actualizaciones en el disco pueden almacenarse y completarse más adelante.
fuente
cat > some.file
, cat obtiene un EOF en stdin, pero el shell no. (2) ¿Por qué contar las referencias? ¿Por qué no alguna forma de recolección de basura? ¿GC no es mucho mejor en espacio de usuario?cat > some.file
lo que realmente está haciendo es bifurcación, abre 'some.file' y lo asigna al descriptor de archivo 1, luego lo haceexec("cat")
. Cuando un proceso es exec () 'd, hereda los descriptores de archivo abiertos.