186 votes

fork() branches de plus que prévu?

Envisager le morceau de code suivant:

#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;
}

Sortie de ce programme de 8 points. Comment cela peut-il être possible? Ne devrait pas il y avoir 6 points au lieu de cela?

245voto

wallyk Points 33150

L' fork() primitives souvent s'étend de l'imagination. Jusqu'à ce que vous obtenez une sensation pour lui, vous devez tracer sur le papier ce que chaque opération et compte pour le nombre de processus. N'oubliez pas que fork() crée un quasi-parfaite copie de la processus actuel. La différence la plus importante (pour la plupart) n'est qu' fork()s'valeur de retour est différente entre le parent et l'enfant. (Étant donné que ce code ignore la valeur de retour, il ne fait pas de différence.)

Donc, au début, il y a un processus. Qui crée un second processus, à la fois de qui imprimer une dot et de la boucle. Sur leur deuxième itération, chacun crée une autre copie, il y a donc quatre processus d'impression en un point, puis sur quitter. Donc, nous pouvons facilement compte pour six points, comme vous vous attendez.

Cependant, ce printf() n'a vraiment est un tampon de sa sortie. Donc, le premier point à partir de quand il n'y avait que deux processus ne s'affiche pas lors de l'écrit. Ces points restent dans la mémoire tampon qui est dupliqué à fork(). Il n'est pas jusqu'à ce que le processus est sur le point de sortie de la mémoire tampon point apparaît. Quatre processus de l'impression d'un tampon dot, en plus de la nouvelle donne 8 points.

Si vous vouliez éviter ce comportement, appelez - fflush(stdout); après printf().

70voto

thiton Points 21303

Vous avez non validées tampons dans le flux de sortie. la sortie standard est la ligne de tampon, et le tampon est répliqué avec le reste du processus. Quand le programme se termine, le non validées tampon est écrit deux fois (une fois pour chaque processus). À la fois à l'aide de

printf("a\n");

et

printf("a "); fflush(stdout);

ne pas exposer le problème.

Dans ton premier exemple, vous créez quatre processus qui ont chacune deux points dans leur flux de sortie de la mémoire tampon. Lors de chaque phase se termine, il vide sa mémoire tampon, la génération de huit points.

2voto

Tauseef Points 1

lorsque i=0

Process_1: mise en mémoire Tampon texte= 1 point

Process_2(créé par Process_1): mise en mémoire Tampon texte= 1 point

lorsque i=1

Process_3(créé par Process_1): Hériter de 1 tampon point de Process_1 et imprime 1 point par lui-même. Au total Process_3 imprime 2 points.

Process_4(créé par Process_2): Hériter de 1 tampon point de Process_2 et imprime 1 point par lui-même. Au total Process_4 imprime 2 points.

Process_1 : Imprime 2 points (Un tampon point lorsque i=0 et un autre point lorsque i=1)

Process_2 : Imprime 2 points (Un tampon point lorsque i=0 et un autre point lorsque i=1)

Résultat Final: 8 points. :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X