GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi un programme avec Fork() imprime-t-il parfois sa sortie plusieurs fois ?

Dans le programme 1 Hello world est imprimé une seule fois, mais lorsque je supprime \n et exécutez-le (Programme 2), la sortie est imprimée 8 fois. Quelqu'un peut-il m'expliquer la signification de \n ici et comment cela affecte le fork() ?

Programme 1

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

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

Sortie 1 :

hello world... 

Programme 2

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

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

Sortie 2 :

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

Réponse acceptée :

Lors de la sortie sur la sortie standard à l'aide de printf() de la bibliothèque C fonction, la sortie est généralement mise en mémoire tampon. Le tampon n'est pas vidé jusqu'à ce que vous produisiez une nouvelle ligne, appelez fflush(stdout) ou quittez le programme (pas en appelant _exit() mais). Le flux de sortie standard est par défaut mis en mémoire tampon de cette manière lorsqu'il est connecté à un TTY.

Lorsque vous bifurquez le processus dans "Programme 2", les processus enfants héritent de chaque partie du processus parent, y compris le tampon de sortie non vidé. Cela copie effectivement le tampon non vidé dans chaque processus enfant.

Lorsque le processus se termine, les tampons sont vidés. Vous démarrez un grand total de huit processus (y compris le processus d'origine), et le tampon non vidé sera vidé à la fin de chaque processus individuel.

Il est huit car à chaque fork() vous obtenez deux fois le nombre de processus que vous aviez avant le fork() (puisqu'ils sont inconditionnels), et vous en avez trois (2 =8).


Linux
  1. Pourquoi la substitution de commande Shell engloutit-elle un caractère de fin de ligne ?

  2. Comment un programme décide-t-il d'avoir ou non une sortie colorée ?

  3. Pourquoi Ls -l affiche-t-il une taille différente de Ls -s ?

  4. Exemple Perl Hello World :comment écrire et exécuter un programme Perl sur un système d'exploitation Unix

  5. Exemple Smalltalk Hello World :comment écrire et exécuter un programme Smalltalk sur un système d'exploitation Linux

Imprimer l'horodatage avec la sortie de la commande Ping sous Linux

Pourquoi l'option Ssh -t ajoute-t-elle Cr &Lf dans la sortie redirigée ?

Exemple Python Hello World :comment écrire et exécuter un programme Python sur le système d'exploitation Unix

Exemple Ruby Hello World :comment écrire et exécuter un programme Ruby sur un système d'exploitation Unix

Pourquoi un Lun World Wide ID commence-t-il par le numéro 3 dans Linux dm-multipath

Pourquoi ce pipeline shell sort-il ?