En "Programación avanzada en el entorno Unix", 2da edición, por W. Richard Stevens.¿Alguien puede explicar una descripción simple con respecto al 'descriptor de archivo' después de fork()?
Sección 8.3 Función de horquilla.
Aquí está la descripción:
Es importante que el padre y el hijo comparten el mismo archivo offset.
Considere un proceso que bifurca a un niño, luego espera a que el niño complete. Suponga que ambos procesos escriben en salida estándar como parte de su procesamiento normal. Si el padre tiene su salida estándar redirigida (por un intérprete de comandos, tal vez), es esencial que el niño actualice la compensación del archivo del padre cuando el niño escribe en la salida estándar.
[1. Qué significa eso? si la salida estándar de los padres se redirecciona a un 'archivo1', por ejemplo, ¿qué debe actualizar el hijo después de que el niño escriba? el desplazamiento de salida estándar original de los padres o el desplazamiento de salida redirigido (es decir, el archivo1)? No puede ser el último, ¿no?]
[2. ¿Cómo se realiza la actualización? por niño explícitamente, por SO implícitamente, por el descriptor de archivos en sí? Después de la bifurcación, pensé que padre e hijo siguieron sus propios caminos y tienen su propia COPIA del descriptor de archivo. Entonces, ¿cómo se actualiza la actualización infantil al lado principal?]
En este caso, el niño puede escribir en la salida estándar mientras el padre está esperando; al finalizar el niño, el padre puede continuar escribiendo en la salida estándar, sabiendo que su salida se agregará a lo que sea que el niño haya escrito. Si el padre y el hijo no compartían el mismo desfase de archivos, este tipo de interacción sería más difícil de lograr y requeriría acciones explícitas del padre.
Si el padre y el hijo escriben en el mismo descriptor, sin ninguna forma de sincronización, como que el padre espere al hijo, su salida se entremezclará (suponiendo que sea un descriptor abierto antes de la bifurcación). Aunque esto es posible, no es el modo normal de operación.
Hay dos casos normales para manejar los descriptores después de un tenedor.
El padre espera a que el niño complete. En este caso, el padre no necesita hacer nada con sus descriptores. Cuando el niño finaliza, cualquiera de los descriptores compartidos que el niño leyó o escribió tendrá sus correcciones de archivos actualizadas en consecuencia.
Tanto el padre como el hijo siguen sus propios caminos. Aquí, después del tenedor, el padre cierra los descriptores que no necesita, y el niño hace lo mismo. De esta forma, ninguno interfiere con las descripciones abiertas del otro. Este escenario es a menudo el caso de los servidores de red."
[3. Cuando se invoca tenedor(), lo único que entiendo es que los niños obtener una copia de lo que los padres tiene, descriptor de archivo, en este caso, y hace lo suyo. Si cualquier desplazamiento cambia al descriptor de archivo que padre e hijo comparten, solo puede ser porque el descriptor recuerda el desplazamiento en sí. ¿Estoy en lo cierto?]
Lo siento, soy un poco nuevo en los conceptos .
¿Algún ayuda? Gracias.
Alan, ¡la explicación es genial! Gracias por tomarse el tiempo y explicarlo con tanto detalle para un novato. – user1559625
@AlanCurry ¿Qué sucede si no uso wait() en el programa principal?¿La descripción del archivo sería libre a medida que el proceso principal salga? – Nmzzz
¡servicial! ¡gracias! – Kross