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!