¿Qué sucede cuando cierro () un descriptor de file?

Estoy tratando de get una image completa con los descriptores de files. Digamos que tengo process1 que inicialmente tiene estas descripciones de files:

_process1_ | | | 0 stdin | | 1 stdout | | 2 stderr | |__________| 

Luego cierro el descriptor de file 1:

 close(1); 

El descriptor de file 1 traduce (señala) a la estructura de ARCHIVO stdout en la tabla de files abiertos del kernel.

Con el código anterior, el descriptor de file 1 se elimina de la tabla del process, que se convierte en:

  _process1_ | | | 0 stdin | | 2 stderr | |__________| 

Pero, ¿qué sucede en el kernel? ¿La estructura stdout FILE se desasigna? ¿Cómo es posible si stdout es un file especial (el monitor) y probablemente sea utilizado por otros processs? ¿Qué pasa con las estructuras de ARCHIVO que son solo files normales (.txt, por ejemplo)? ¿Qué ocurre si dicho file está siendo utilizado por otro process?

El descriptor de file 1 se traduce a la estructura de ARCHIVO stdout en la tabla de files abiertos del kernel.

Esto es un malentendido. La tabla de files del kernel no tiene nada que ver con las estructuras de files de espacio de usuario.

En cualquier caso, el kernel tiene dos niveles de indirección. Existe la estructura interna que representa el file en sí, que es reference contada. Hay una "descripción de file abierto" que es reference contada. Y luego está el manejador de file, que no es reference contada. La estructura del file señala el path hacia el inodo en sí. La descripción del file abierto contiene elementos como el modo abierto y el puntero del file.

Cuando llama close, siempre cierra el manejador de file. Cuando se cierra un identificador de file, el recuento de references en su descripción de file abierto se networkinguce. Si va a cero, la descripción del file abierto también se libera y el recuento de references en el file se networkinguce. Solo si eso va a cero se libera la estructura de files del kernel.

No hay posibilidad de que un process libere un recurso que está utilizando otro process porque los resources compartidos se countn por reference.

En este caso, no pasarán muchas cosas. stdin, stdout y stderr tienden a ser clones del mismo descriptor de file. El contador de reference para el descriptor de file se networkingucirá en uno. El mismo descriptor de file suele estar en el shell desde el que se ejecutó el progtwig, por lo que el descriptor de file debe mantenerse.

El kernel mantiene recuentos de reference para todos los files (inodos) que están abiertos. Siempre que el recuento de references sea mayor que cero, el file se mantendrá. Esperaría que se mantenga un contador separado para los manejadores de files abiertos. Una vez que esto llega a cero, el kernel puede liberar la memory utilizada por el identificador de file.

Cuando se hayan eliminado todas las references al file (inputs de directory y manejadores de files), el código del sistema de files marcará el ínodo para su reutilización. Todos los bloques que tiene el file están disponibles para su asignación. Muchos filesystems borrarán los pointers de bloque en el inodo cuando se lance. Esto hace que la recuperación de un file eliminado sea difícil. Las actualizaciones en el disco pueden almacenarse temporalmente y completarse en otro momento.