Caso curioso de ramificación inesperada en fork()
Considere el siguiente fragmento de código que emplea la primitiva fork() para crear procesos secundarios:
#include
#include
#include
int main(void)
{
int i;
for(i = 0; i Sorprendentemente, al ejecutar este programa se obtienen ocho puntos de salida, seis más de lo que se podría anticipar inicialmente. ¿Por qué ocurre esto?
Revelando los procesos ocultos
Para desentrañar este misterio, profundicemos en el funcionamiento de fork(). fork() crea una réplica del proceso actual, lo que da como resultado un proceso padre y un proceso hijo.
Inicialmente, hay un solo proceso, que se bifurca en dos. Ambos procesos ejecutan incrementalmente el bucle for, imprimiendo un punto cada vez. En la segunda iteración, cada proceso se bifurca nuevamente, creando un total de cuatro procesos. Estos cuatro procesos imprimen un punto antes de terminar.
Salida almacenada en búfer y apariencia retrasada
Sin embargo, printf() almacena en búfer su salida, lo que significa que acumula varias impresiones antes de enviarlas. inmediatamente. Cuando los cuatro procesos imprimen sus segundos puntos, se almacenan en el búfer. Aquí es donde surge el efecto engañoso.
Al fork(), los procesos secundarios heredan los puntos almacenados en el búfer. Entonces, cuando cada proceso hijo sale, su punto almacenado en el búfer aparece en el flujo de salida. Sumar estos cuatro puntos retrasados a los cuatro puntos impresos incrementalmente representa el total inesperado de ocho.
Evitar puntos almacenados en el búfer
Para evitar este comportamiento almacenado en el búfer, es recomendable llamar descarga(salida estándar); después de cada declaración printf(). Esto obliga a que la salida se envíe inmediatamente, lo que garantiza que se muestre la cantidad esperada de puntos.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3