c++ corrigés - branches fork () plus que prévu?




2 Answers

La primitive fork() étire souvent l'imagination. Jusqu'à ce que vous en ayez une idée, vous devez tracer sur papier ce que chaque opération est et tenir compte du nombre de processus. N'oubliez pas que fork () crée une copie quasi-parfaite du processus en cours. La différence la plus significative (dans la plupart des cas) est que la valeur de retour de fork() diffère entre parent et enfant. (Puisque ce code ignore la valeur de retour, cela ne fait aucune différence.)

Donc, au début, il y a un processus. Cela crée un deuxième processus, les deux qui impriment un point et une boucle. Lors de leur deuxième itération, chacun crée une autre copie, il y a donc quatre processus imprimer un point, puis quitter. Nous pouvons donc facilement comptabiliser six points, comme vous le souhaitez.

Cependant, ce que fait vraiment printf() est de tamponner sa sortie. Donc, le premier point à partir de quand il n'y avait que deux processus n'apparaît pas lorsqu'il est écrit. Ces points restent dans le tampon, qui est dupliqué sur fork (). Ce n'est que lorsque le processus est sur le point de sortir que le point tamponné apparaît. Quatre processus d'impression d'un point tamponné, plus le nouveau donne 8 points.

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

fork() exercices

Considérez 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;
}

Ce programme produit 8 points. Comment cela peut-il être possible? Ne devrait-il pas y avoir 6 points à la place?




quand i = 0

Process_1: Texte mis en tampon = 1 point

Process_2 (créé par Process_1): Texte mis en tampon = 1 point

quand je = 1

Processus3 (créé par Process_1): Hérite d'un point mis en mémoire tampon 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érite d'un point tamponné de Process_2 et imprime 1 point par lui-même. Au total Process_4 imprime 2 points.

Processus_1: imprime 2 points (un point tamponné lorsque i = 0 et un autre point lorsque i = 1)

Process_2: imprime 2 points (un point tamponné quand i = 0 et un autre point quand i = 1)

Sortie finale: 8 points. :)




Related

c++ c fork

Tags

c++   c   fork