Descriptor de archivo y tenedor

15

Cuando un niño se bifurca, hereda los descriptores de archivo de los padres, si el niño cierra el descriptor de archivos, ¿qué sucederá? Si el niño comienza a escribir, ¿qué pasará con el archivo al final de los padres? ¿Quién maneja estas inconsistencias, kernel o usuario?

cuando un proceso llama a la closefunción para cerrar un archivo abierto en particular a través del descriptor de archivo. En la tabla de archivos del proceso, el recuento de referencia se reduce en uno. Pero como el padre y el hijo tienen el mismo archivo, el recuento de referencias es 2 y después de cerrar se reduce a 1. Dado que no es cero, el proceso sigue utilizando el archivo sin ningún problema.

Consulte la programación del sistema Terrence Chan UNIX, (soporte de kernel de Unix para archivos).

Madan Ram
fuente
De acuerdo, no importa ese último comentario;) En las páginas de manual para open()y fork()hay una distinción entre un archivo descriptivo o una descripción de archivo : el primero se refiere al segundo , y aunque los descriptores en una bifurcación son copias, se refieren a la misma descripción. Sin embargo, cuando se prueba, es obvio que esto no significa que cerrar el asa del niño cierra el asa de los padres. Creo que podría hacer una sutil diferencia en el entrelazado de datos cuando ambos manejadores escriben, pero eso es indeterminado de todos modos, por lo que exactamente cómo sucede no es tan importante.
Ricitos de oro

Respuestas:

28

Cuando un niño se bifurca, hereda los descriptores de archivo de los padres, si el niño cierra el descriptor de archivos, ¿qué sucederá?

Hereda una copia del descriptor de archivo. Entonces, cerrar el descriptor en el niño lo cerrará para el niño, pero no para el padre, y viceversa.

Si el niño comienza a escribir, ¿qué pasará con el archivo al final de los padres? ¿Quién maneja estas inconsistencias, kernel o usuario?

Es exactamente (como en, exactamente literalmente) lo mismo que dos procesos que escriben en el mismo archivo. El núcleo programa los procesos de forma independiente, por lo que probablemente obtendrá datos intercalados en el archivo.

Sin embargo, POSIX (con el cual los sistemas * nix se ajustan en gran parte o completamente), estipula que read()y las write()funciones de la API C (que se asignan a las llamadas al sistema) son "atómicas entre sí cuando operan en archivos regulares o enlaces simbólicos ". El GNU C manualmente también promete esto provisionalmente con respecto a las tuberías (tenga en cuenta que el valor predeterminado PIPE_BUF, que es parte de la condición, es de 64 kiB). Esto significa que las llamadas en otros idiomas / herramientas, como el uso de echoo cat, deben incluirse en ese contrato, por lo que si dos procesos independientes intentan escribir "hola" y "mundo" simultáneamente en la misma tubería, lo que saldrá del otro el final es "helloworld" o "worldhello", y nunca algo como "

cuando un proceso llama a la función de cierre para cerrar un archivo abierto en particular a través del descriptor de archivo. La tabla de proceso del archivo disminuye el recuento de referencias en uno. Pero como el padre y el hijo mantienen el mismo archivo (el recuento de referencias es 2 y después del cierre se reduce a 1) ya que no es cero, el proceso aún continúa utilizando el archivo sin ningún problema.

Hay DOS procesos, el padre y el hijo. No existe un "recuento de referencias" común para ambos. Son independientes. WRT lo que sucede cuando uno de ellos cierra un descriptor de archivo, vea la respuesta a la primera pregunta.

encerrada dorada
fuente
1

Siempre fork()que se crea un nuevo hijo, los descriptores de archivo no se retienen en absoluto, se modifican.

Aunque el archivo será un duplicado, tendrá un descriptor de archivo diferente.

mannukaushikece
fuente