Maison > développement back-end > C++ > Pourquoi `fork()` génère-t-il 8 points au lieu de 6 dans ce code ?

Pourquoi `fork()` génère-t-il 8 points au lieu de 6 dans ce code ?

Patricia Arquette
Libérer: 2024-11-03 17:32:30
original
319 Les gens l'ont consulté

Why Does `fork()` Output 8 Dots Instead of 6 in This Code?

Comportement de branchement inattendu de Fork()

Considérez le code suivant qui utilise l'appel système fork() :

<code class="c">#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
    int i;
    for(i = 0; i < 2; i++)
    {
        fork();
        printf(".");
    }
    return 0;
}</code>
Copier après la connexion

Étonnamment, lorsque ce programme est exécuté, il génère 8 points au lieu des 6 attendus. Cet écart semble au premier abord déroutant.

Disséquer l'exécution du code

Pour comprendre ce comportement, nous devons décomposer le processus d'exécution étape par étape :

  1. État initial : Il y a un seul processus en cours d'exécution.
  2. Première itération : Le processus se divise, créant un processus enfant avec un espace mémoire séparé. Le parent et l'enfant impriment un point.
  3. Deuxième itération : Le parent et l'enfant bifurquent à nouveau, créant un total de quatre processus. Chacun imprime un point.
  4. Fin du processus : Les quatre processus se terminent, mais les points mis en mémoire tampon des opérations d'impression précédentes restent dans le tampon de sortie.

Sortie tamponnée

Le nœud du problème réside dans la sortie tamponnée de printf(). Lorsqu’un processus imprime, la sortie n’est pas immédiatement affichée à l’écran. Au lieu de cela, il est stocké dans un tampon. Ce comportement est important car l'appel système fork() copie le tampon, ce qui entraîne des points tampons en double.

Un total de 8 points

Lorsque les quatre processus se terminent, leurs points tampons sont vidés, les ajoutant au point unique imprimé initialement. Cela donne un total de 8 points en sortie.

Éviter le problème

Pour éviter ce comportement, on peut explicitement vider le tampon de sortie en utilisant fflush(stdout) après chaque appel à printf(). Cela garantit que la sortie est immédiatement envoyée à l'écran, éliminant ainsi l'écart entre le nombre de processus et le nombre de points imprimés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal