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>
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!