Maison > développement back-end > C++ > Pourquoi ce programme C imprime-t-il 8 points au lieu de 6 lors de l'utilisation de fork() ?

Pourquoi ce programme C imprime-t-il 8 points au lieu de 6 lors de l'utilisation de fork() ?

Susan Sarandon
Libérer: 2024-11-04 06:57:01
original
1022 Les gens l'ont consulté

Why Does This C Program Print 8 Dots Instead of 6 When Using fork()?

Dilemme de bifurcation fork()

Dans le domaine de la programmation multiprocessus, la fonction fork() règne en maître. Cependant, son comportement peut parfois laisser perplexe les non-initiés. Considérez le 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

Lors de son exécution, ce programme génère non pas 6 points comme on pourrait s'y attendre, mais un étonnant 8 points. Comment est-ce possible ?

Plonger dans les abysses de fork()

La réponse réside dans le fonctionnement complexe de fork(). Cette fonction crée essentiellement une copie presque parfaite du processus en cours, y compris sa mémoire et ses descripteurs de fichiers ouverts. La principale différence réside dans la valeur de retour, qui diffère entre les processus parent et enfant.

Dans notre exemple, le processus initial crée un deuxième processus via le premier fork(). Ces deux processus impriment ensuite un point, avant de boucler et de bifurquer à nouveau. Après le deuxième fork(), il y a quatre processus, chacun imprimant un point avant de quitter. Ainsi, nous pouvons représenter six points.

Cependant, l'intrigue s'épaissit avec la nature cachée de printf(). Par défaut, printf() met sa sortie en mémoire tampon, retardant ainsi son affichage réel. En conséquence, le premier point imprimé avant le premier appel à fork() reste invisible. Ce point caché, ainsi que les quatre points tamponnés des processus parent et trois enfants après le deuxième fork(), donnent le total final de 8 points.

Pour éviter le labyrinthe tamponné

Pour contourner ce comportement et garantir que printf() sort immédiatement, la fonction fflush(stdout) peut être utilisée après chaque appel printf(). Cela force l'écriture de la sortie mise en mémoire tampon, empêchant les points de disparaître dans l'ombre.

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