Maison  >  Article  >  développement back-end  >  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
Patricia Arquetteoriginal
2024-11-03 17:32:30283parcourir

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>

É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!

Déclaration:
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