Forum Programmation.c Ordonnancement processus avec wait()

Posté par . Licence CC by-sa
-1
10
mar.
2017

Bonjour,

Je ne comprend pas la déférence entre l'utilisation de wait() dans ces deux codes :
wait() dois etre exécuter par le pére pour attendre son fils.
Pourquoi dans le 1er code il y'a un IF qui teste s'il est dans le fils ou non alors dans le 2éme est Non
Merci pour votre aide.

code 1

int main(){
        int result1,result2,result3;
        result1 = fork();
        if(result1 == 0){
                result2 = fork();
                if(result2 == 0){
                        result3 = fork();
                        if(result3 >0)
                                wait(NULL);
                }
                else 
                        wait(NULL);
        }
        else
                wait(NULL);
}

code 2 :

int main() {
        int result1, result2, result3;

        result1 = fork();
        result2 = fork();
        result3 = fork();

        if (result3) wait(NULL);

        if (result2) wait(NULL);

        if (result1) wait(NULL);
}
  • # Difference = nombre de processus

    Posté par (page perso) . Évalué à 1.

    En gros avec le premier code tu va générer 4 processus (un processus parent et 3 fils), alors que dans le le second tu va avoir 8 processus:

    Le premier fork va doubler les processus, le second fork va s'executer sur les deux processus donc => on double encore, le troisième fork va s'executer sur les quatres processus => 8 processus.

    • [^] # Re: Difference = nombre de processus

      Posté par . Évalué à 1.

      J'ai pas un probléme avec le Fork(), Je sais le nombre des processus qui va créé mais ce que je comprend pas c'est l'utilisation de wait() dans ces deux codes.
      Merci

      • [^] # Re: Difference = nombre de processus

        Posté par . Évalué à 2.

        c'est l'utilisation de wait() dans ces deux codes.

        ben comme son nom l'indique, la fonction wait() sert à … attendre…

        donc ton programme ouvre des processus fils, qui attendent…

        au hasard, c'est parce que sinon, ils se refermeraient tout de suite, et tu n'aurais pas le temps de les apercevoir ?

  • # hop

    Posté par . Évalué à 1.

    Pourquoi dans le 1er code il y'a un IF qui teste s'il est dans le fils ou non alors dans le 2éme est Non

    Bah si

  • # debug

    Posté par (page perso) . Évalué à 2.

    Dans ces cas là, la meilleure façon de comprendre ce qu'il se passe est d'exécuter le programme en pas à pas, via gdb par exemple.

    Ou d'ajouter des logs : printf("je suis le fils, mon pid est (%d), mon père est (%d)\n", getpid(), getppid());

  • # deuxième code

    Posté par (page perso) . Évalué à 1.

    Dans le deuxième code, le premier processus qui a fait trois forks fera trois waits. Le deuxième processus en fera deux. Deux processus, qui ont un fils feront un wait, et les quatre qui n ont pas de fils n en feront pas, car tous leurs results sont nuls.

    • [^] # Re: deuxième code

      Posté par (page perso) . Évalué à 1.

      Ce que j'ai écrit est incorrect. Sur les huit processus il n'y en a qu'un pour lequel les trois entiers result1, result2 et result3 sont nuls. Car d'après le manuel de fork :

      fork() crée un nouveau processus en copiant le processus appelant. Le nouveau processus, qu'on appelle fils, est une copie exacte du processus appelant.

      Les valeurs précédentes des entiers results1 et results2 sont donc aussi copiées.

      Lorsqu'un processus qui a déjà un fils, forke à nouveau, le nouveau fils attendra le premier fils de son père. Cette attente n'est pas obligatoire (car le même processus sera attendu plusieurs fois), mais n'est pas bloquante non plus. cf. le manuel de wait :

      Si un fils a déjà changé d'état, ces appels système retournent immédiatement

      Et c'est plus simple à coder ainsi.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.