En el Programa 1 Hello world
se imprime solo una vez, pero cuando elimino \n
y ejecútelo (Programa 2), la salida se imprime 8 veces. ¿Puede alguien explicarme el significado de \n
? aquí y cómo afecta al fork()
?
Programa 1
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("hello world...\n");
fork();
fork();
fork();
}
Salida 1:
hello world...
Programa 2
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("hello world...");
fork();
fork();
fork();
}
Salida 2:
hello world... hello world...hello world...hello world...hello world...hello world...hello world...hello world...
Respuesta aceptada:
Al enviar a la salida estándar usando printf()
de la biblioteca C 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 a fflush(stdout)
o salir del programa (no llamando a _exit()
aunque). El flujo de salida estándar tiene un búfer de línea predeterminado 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 vaciar. Esto copia efectivamente el búfer no vaciado en cada proceso secundario.
Cuando termina el proceso, los búferes se vacían. Inicia un total de ocho procesos (incluido el proceso original) y el búfer no vaciado se vaciará al final de cada proceso individual.
Son las ocho porque en cada fork()
obtienes el doble de procesos que tenías antes del fork()
(ya que son incondicionales), y tienes tres de estos (2 =8).