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>
Une fois exécuté, ce programme affiche étonnamment 8 points au lieu des 6 attendus. Comment est-ce possible ?
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.
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.
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.
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!