Maison  >  Article  >  développement back-end  >  Pourquoi ma boucle `fork()` produit-elle plus de sortie que prévu ?

Pourquoi ma boucle `fork()` produit-elle plus de sortie que prévu ?

DDD
DDDoriginal
2024-11-04 07:46:31198parcourir

Why Does My `fork()` Loop Produce More Output than Expected?

Pourquoi fork() se branche-t-il plus que prévu ?

Considérez l'extrait de code suivant :

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

Une fois exécuté, ce programme affiche étonnamment 8 points au lieu des 6 attendus. Comment est-ce possible ?

Le comportement de fork()

Pour comprendre le résultat inattendu, nous devons nous plonger dans les subtilités de la primitive fork(). Lorsque fork() est invoqué, il crée une copie presque parfaite du processus en cours. La différence la plus notable (dans la plupart des cas) réside dans les valeurs de retour différentes pour les processus parent et enfant. Cependant, le code fourni ignore ces valeurs de retour, rendant effectivement cette distinction non pertinente.

Traçage de l'exécution

Au départ, il existe un seul processus. Par la suite, il crée un deuxième processus, ce qui entraîne l'impression d'un point par deux processus et la poursuite de la boucle. Lors de leur deuxième itération, chaque processus crée à nouveau une copie, conduisant à quatre processus qui impriment un point puis se terminent. Ceci explique les six premiers points.

Tamponnage et sortie différée

Cependant, printf() utilise la mise en mémoire tampon de sortie. Ainsi, le point initial imprimé par les deux procédés n’est pas immédiatement visible. Ces points restent mis en mémoire tampon et sont dupliqués pendant fork(). Ce n'est qu'à la fin d'un processus que les points mis en mémoire tampon sont vidés et apparaissent. Ainsi, quatre processus générant un point mis en mémoire tampon, ainsi qu'un nouveau point, produisent une sortie inattendue de 8 points.

Prévenir la sortie inattendue

Pour supprimer ce comportement, fflush(stdout); peut être appelé après chaque instruction printf(), garantissant ainsi que les points sont immédiatement affiché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