Maison > développement back-end > C++ > le corps du texte

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

DDD
Libérer: 2024-11-04 07:46:31
original
197 Les gens l'ont consulté

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>
Copier après la connexion

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!