Comportement de branchement inattendu de Fork()
Considérez le code suivant qui utilise l'appel système fork() :
<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>
Étonnamment, lorsque ce programme est exécuté, il génère 8 points au lieu des 6 attendus. Cet écart semble au premier abord déroutant.
Disséquer l'exécution du code
Pour comprendre ce comportement, nous devons décomposer le processus d'exécution étape par étape :
Sortie tamponnée
Le nœud du problème réside dans la sortie tamponnée de printf(). Lorsqu’un processus imprime, la sortie n’est pas immédiatement affichée à l’écran. Au lieu de cela, il est stocké dans un tampon. Ce comportement est important car l'appel système fork() copie le tampon, ce qui entraîne des points tampons en double.
Un total de 8 points
Lorsque les quatre processus se terminent, leurs points tampons sont vidés, les ajoutant au point unique imprimé initialement. Cela donne un total de 8 points en sortie.
Éviter le problème
Pour éviter ce comportement, on peut explicitement vider le tampon de sortie en utilisant fflush(stdout) après chaque appel à printf(). Cela garantit que la sortie est immédiatement envoyée à l'écran, éliminant ainsi l'écart entre le nombre de processus et le nombre de points imprimé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!