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