GNU/Linux >> Linux Esercitazione >  >> Linux

Perché un programma con Fork() a volte stampa il suo output più volte?

Nel programma 1 Hello world viene stampato solo una volta, ma quando rimuovo \n ed eseguirlo (Programma 2), l'output viene stampato 8 volte. Qualcuno può spiegarmi il significato di \n qui e come influisce su fork() ?

Programma 1

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("hello world...\n");
    fork();
    fork();
    fork();
}

Uscita 1:

hello world... 

Programma 2

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("hello world...");
    fork();
    fork();
    fork();
}

Uscita 2:

hello world... hello world...hello world...hello world...hello world...hello world...hello world...hello world...

Risposta accettata:

Quando si esegue l'output sull'output standard utilizzando printf() della libreria C funzione, l'output è solitamente memorizzato nel buffer. Il buffer non viene svuotato finché non emetti una nuova riga, chiama fflush(stdout) oppure esci dal programma (non chiamando _exit() anche se). Il flusso di output standard è per impostazione predefinita con buffer di linea in questo modo quando è collegato a un TTY.

Quando si esegue il fork del processo nel "Programma 2", i processi figlio ereditano ogni parte del processo padre, incluso il buffer di output non scaricato. Questo copia efficacemente il buffer non scaricato in ogni processo figlio.

Al termine del processo, i buffer vengono svuotati. Inizi un totale di otto processi (incluso il processo originale) e il buffer non scaricato verrà svuotato al termine di ogni singolo processo.

Sono le otto perché ad ogni fork() ottieni il doppio del numero di processi che avevi prima di fork() (poiché sono incondizionati) e ne hai tre (2 =8).


Linux
  1. Perché l'uomo stampa "gimme Gimme Gimme" alle 00:30?

  2. Esempio Python Hello World:come scrivere ed eseguire il programma Python su sistema operativo Unix

  3. Esempio Ruby Hello World:come scrivere ed eseguire il programma Ruby su Unix OS

  4. Esempio XQuery Hello World:come scrivere ed eseguire il programma XQuery su sistema operativo Linux

  5. Perché un Lun World Wide ID inizia con il numero 3 in Linux dm-multipath

Stampa timestamp con output del comando Ping in Linux

Esempio Fortran Hello World:come scrivere ed eseguire il programma Fortran su sistema operativo Linux

Perché Tomcat funziona con la porta 8080 ma non con la 80?

Come reindirizzare l'output del programma come input

Perché non posso mandare in crash il mio sistema con una fork bomb?

iftop - come generare un file di testo con il suo output?