Utilisation de fork()

Bonsoir.

J'ai du mal a comprendre l'effet de cette fonction surtout lorsqu'il s'agit des boucles.

Voila un petit exercice qui me gène :

void main {
int i,f,x;
x=1;
For(i=0; i<3;i++) {
f=fork()
if(f==0) { x=x*2;
printf( " pid %d : %d" ,getpid() , x);
}
}
exit(0);
}

Si je me trompe pas, le processus père va créer 3 processus fils avex les valeurs de x respctivement 2,4 et 8.

je suis pas convaicu .j'ai besoin de votre aide svp !!

Merci d'avance.
Configuration: Windows XP Internet Explorer 7.0

5 réponses

  1. Avec fork tu crée des processus lourds donc espace mémoire non partagé meme par les ariables globales.
    Le PID du fils vaut 0 il y a toujours des if de ce style quand tu bosse sur avec des fork peut etre cui la t'aidera a comprendre
    http://www.jecompile.com/viewthread.php?tid=53
    mais en gros 2 fais 'fois 2' sur le nb de processus crées a chaque fork ;-)
    2
    1. Merci loupius.
      0
      1. ce programme va cree trois processus fils!! mais combien de lignes seront imprimées lors de l'execution du programmme?
        0
      2. @adelinooDésolé, mais ta réponse est incomplète;
        Bonne réflexion
        0
    2. Contributeur
      Si je ne me trompe pas, les processus père et fils (ainsi que frères) ne partagent pas la même mémoire.
      0
      1. Exact (c'est ce qui différencie le 'fork' du 'thread'), mais il ne faut pas oublier qu'avant il y a duplication des variables existantes.
        0
      2. Contributeur
        @loupiusforcément, on ne va pas coupé la mémoire en deux ;)
        0
    3. A toi de faire les tests en complétant ton code. Voici un exemple à adapter à ton OS:
      #include <stdio.h>
      #include <stdlib.h>
      #include <unistd.h>
      
      int main()
      {
        int i, f, x = 1;
      
        for(i=0; i<3; i++)
        {
          if ((f = fork()) == -1)
          {
            printf ("Erreur fork\n");
            return (EXIT_FAILURE);
          }
          if (f==0)
          {
            x = x*2;
            printf(" fils: pid %d : x = %d\n" ,getpid() , x);
          }
          else
            printf(" père: pid %d : x = %d\n" ,getpid() , x);
        }
        return (EXIT_SUCCESS);
      }
      Ne sois pas surpris par le résultat; le programme fonctionne bien et , bien sûr, je te laisse interpréter ce résultat qui est plein d'enseignements.
      Ce code n'est pas tout à fait correct car on doit attendre la fin des fils avant de terminer le programme. Mais ceci n'est qu'un exemple pour 'fork'.
      Bonne continuation.
      0
      1. x*2 ou x puissance 2 ?
        f= 0 ou f = = O ?
        0