Maison  >  Article  >  développement back-end  >  Pourquoi `fork()` produit-il plus de points que prévu dans ce code ?

Pourquoi `fork()` produit-il plus de points que prévu dans ce code ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-04 01:31:02714parcourir

Why Does `fork()` Produce More Dots Than Expected in This Code?

Pourquoi fork() se branche-t-il plus de fois 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>

Ce code devrait produire 6 points en sortie, car il se divise deux fois et chaque processus imprime un point. Cependant, il génère étonnamment 8 points. Pourquoi cela se produit-il ?

Fork() et duplication de processus

La fonction fork() crée une copie presque parfaite du processus actuel. La différence la plus notable est que la valeur de retour diffère entre les processus parent et enfant.

Dans ce code, les appels fork() créent quatre processus : le processus d'origine et trois processus enfants. Chaque processus imprime un point lors de sa création, représentant les six premiers points.

Sortie tamponnée

Cependant, il y a un autre problème. printf() utilise un tampon pour stocker la sortie jusqu'à ce qu'elle soit vidée ou que le processus se termine. Dans ce code, la sortie n'est pas vidée jusqu'à la fin des processus.

Par conséquent, les points du processus d'origine et du premier processus enfant restent dans le tampon pendant le deuxième fork. Lorsque les quatre processus restants (deux du premier fork et deux du deuxième fork) sortent, ils vident leurs tampons, provoquant l'impression des points. Cela porte la sortie totale à 8 points.

Prévention de la sortie tampon

Pour éviter ce comportement, vous pouvez appeler fflush(stdout); après chaque appel à printf() pour forcer le vidage immédiat de la sortie. Cependant, cela peut avoir un impact sur les performances dans certains scénarios.

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