Saltar al contenido

¿Por qué un programa con fork () a veces imprime su salida varias veces?

Solución:

Al enviar a salida estándar utilizando la biblioteca C printf() función, la salida generalmente se almacena en búfer. El búfer no se vacía hasta que genera una nueva línea, llame fflush(stdout) o salir del programa (no llamando _exit() aunque). El flujo de salida estándar se almacena en búfer de línea por defecto de esta manera cuando está conectado a un TTY.

Cuando bifurca el proceso en el “Programa 2”, los procesos secundarios heredan cada parte del proceso principal, incluido el búfer de salida sin purgar. Esto copia efectivamente el búfer no descargado a cada proceso hijo.

Cuando el proceso termina, los búferes se vacían. Usted inicia un total de ocho procesos (incluido el proceso original) y el búfer no descargado se vaciará al finalizar cada proceso individual.

Es ocho porque en cada fork() obtienes el doble de procesos que tenías antes de la fork() (ya que son incondicionales), y tienes tres de estos (23 = 8).

No afecta a la horquilla de ninguna manera.

En el primer caso, termina con 8 procesos sin nada que escribir, porque el búfer de salida ya se ha vaciado (debido a la n).

En el segundo caso, todavía tiene 8 procesos, cada uno con un búfer que contiene “Hola mundo …” y el búfer se escribe al final del proceso.

@Kusalananda explicó por qué la salida es repetido. Si tiene curiosidad por qué se repite la salida 8 veces y no solo 4 veces (el programa base + 3 horquillas):

int main()
{
    printf("hello world...");
    fork(); // here it creates a copy of itself --> 2 instances
    fork(); // each of the 2 instances creates another copy of itself --> 4 instances
    fork(); // each of the 4 instances creates another copy of itself --> 8 instances
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *