example c++ c fork

c++ - c fork example



fork() ramas más de lo esperado? (3)

Considere la siguiente pieza de código:

#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int i; for(i = 0; i < 2; i++) { fork(); printf("."); } return 0; }

Este programa produce 8 puntos. ¿Cómo puede ser eso posible? ¿No debería haber 6 puntos en su lugar?


La primitiva fork() 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 diferencia).

Entonces, 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 búfer, que se duplica en la bifurcación (). 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 a fflush(stdout); después de printf() .


Tiene búferes no confirmados en las secuencias de salida . stdout es buffer de línea, y el buffer se replica junto con el resto del proceso. Cuando el programa finaliza, el buffer no asignado se escribe dos veces (una para cada proceso). Ambos usando

printf("a/n");

y

printf("a "); fflush(stdout);

no exhibes el problema

En su primer ejemplo, crea cuatro procesos que tienen cada dos puntos en su buffer de flujo de salida. Cuando cada flujo termina, vacía su memoria intermedia, generando ocho puntos.


cuando i = 0

Proceso_1: Texto almacenado en buffer = 1 punto

Process_2 (creado por Process_1): texto almacenado = 1 punto

cuando i = 1

Process_3 (creado por Process_1): Hereda 1 punto amortiguado de Process_1 e imprime 1 punto por sí mismo. En total Process_3 imprime 2 puntos.

Process_4 (creado por Process_2): hereda 1 punto amortiguado de Process_2 e imprime 1 punto por sí mismo. En total Process_4 imprime 2 puntos.

Proceso_1: Imprime 2 puntos (un punto de memoria intermedia cuando i = 0 y otro punto cuando i = 1)

Process_2: Imprime 2 puntos (Un punto de memoria cuando i = 0 y otro punto cuando i = 1)

Salida final: 8 puntos. :)