GNU/Linux >> Tutoriales Linux >  >> Linux

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

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).


Linux
  1. ¿Por qué la sustitución de comandos de Shell engulle un carácter de nueva línea final?

  2. ¿Cómo decide un programa si tiene o no una salida en color?

  3. ¿Por qué la opción Ssh -t agrega Cr y Lf en la salida redirigida?

  4. ¿Por qué Ls -l produce un tamaño diferente de Ls -s?

  5. Ejemplo de Smalltalk Hello World:cómo escribir y ejecutar el programa Smalltalk en el sistema operativo Linux

Imprimir marca de tiempo con salida de comando ping en Linux

Ejemplo de Ruby Hello World:cómo escribir y ejecutar el programa Ruby en el sistema operativo Unix

Ejemplo de Perl Hello World:cómo escribir y ejecutar el programa Perl en el sistema operativo Unix

¿Por qué sale esta canalización de shell?

Cómo redirigir la salida del programa como su entrada

¿Cómo maneja copy-on-write en fork() múltiples bifurcaciones?