La primitiva fork()
a menudo estira la imaginación. Hasta que lo sienta, debe rastrear en el papel qué es cada operación y tener en cuenta el número 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 el valor de retorno de fork()
difiere entre padre e hijo. (Dado que este código ignora el valor de retorno, no hace ninguna diferencia.)
Por lo tanto, al principio, hay un proceso. Eso crea un segundo proceso, ambos imprimen 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 contabilizar fácilmente seis puntos, como usted espera.
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 está escrito. Esos puntos permanecen en el buffer — que se duplica en fork(). No es hasta que el proceso está por salir que aparece el punto amortiguado. Cuatro procesos imprimen un punto amortiguado, más el nuevo da 8 puntos.
Si desea evitar ese comportamiento, llame al fflush(stdout);
después de printf()
.
[Ver esta publicación] (http://stackoverflow.com/questions/10909011/how-to-use-fork-to-create-only-2-child-processes/10909090#10909090) – tuxuday
http: //ideone.com/B9HXL –