Lo fork()
primitivo a menudo estira la imaginación. Hasta que lo sienta, debe rastrear en papel cuál es cada operación y tener en cuenta la cantidad de procesos. No olvide que fork () crea una copia casi perfecta del proceso actual. La diferencia más significativa (para la mayoría de los propósitos) es que fork()
el valor de retorno difiere entre padre e hijo. (Dado que este código ignora el valor de retorno, no hace ninguna diferencia).
Entonces, al principio, hay un proceso. Eso crea un segundo proceso, que imprime un punto y un bucle. En su segunda iteración, cada uno crea otra copia, por lo que hay cuatro procesos que imprimen un punto y luego salen. Por lo tanto, podemos dar cuenta de seis puntos, como es de esperar.
Sin embargo, lo que printf()
realmente hace es amortiguar su salida. Entonces, el primer punto de cuando solo había dos procesos no aparece cuando se escribe. Esos puntos permanecen en el búfer, que se duplica en fork (). No es hasta que el proceso está a punto de salir que aparece el punto almacenado. Cuatro procesos que imprimen un punto almacenado, más el nuevo da 8 puntos.
Si desea evitar ese comportamiento, llame fflush(stdout);
después printf()
.