IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Partage d'une variable entre les processus fils


Sujet :

Linux

  1. #1
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut Partage d'une variable entre les processus fils
    salut tous le monde j'ai trois gros problemes . commencons par le premier :
    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    // ensemble d'include par ici
    int nbrVoiture[]={0,0,0,0} // un tableau de4 entiers initialisés a 0;
     
    main()
    {
     
    // bla bla bla 
     
    for (i = 0 ; i < 10 ; i++)
         {
     
           if ((id = fork()) == -1)
             {
               printf("fork processus principale\n");
               exit(0);
             }
           else
             {
               if (id == 0)
               {
                uneMethode();
               }
                exit(0); 
             }
    }
     
    void uneMethode()
    {
    int j;
    for(j=0;j<4;j++)
        nbrVoiture[j]++;
     
    for(j=0;j<4;j++)
        printf("la voiture numero %d devient %d\n",j,nbrVoiture[j]);
    }
    }
    le probleme dans ce code est que nbrVoiture[j]++ n'a un effet que sur l'appel local en effet uneMethode() ne m'affiche que des 1 pour chaque appel .
    Normalement nbrVoiture est une variable globale et les modifications doivent restées a la fin de uneMethode()

    J' ai essayé aussi de passer par adreese nbrVoiture mais c'a na pas marché


    [Modéré par Ludovc fernàndez]
    Veuillez respecter les règles du forum SVP : Ajout du tag TITRE
    Mehdi Feki : Modérateur .Net

  2. #2
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Salut,

    Je ne comprends pas ton probleme... Que cherches-tu exactement à faire ?

    Tu initialises un tableau a 0, puis tu fais ++ pour chaque element : chaque element est donc incrémenté de 1
    Au final, tu de retrouves avec un tableau rempli de 1....

    Note: main retourne toujours un int, la definition de fonctions imbriquées est interdite en C ansi, etc.... je suppose que ce n'est pas ton vrai code

    ++
    Pouic
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  3. #3
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Merci Pouic pour ta reponse . :o :o C'est bien mon code Comment tu veux que je le prouve ??
    dans main il ya une boucle for allant de 0 à 10. a chaque iteration je cree un processus fils a l'aide fork donc ce n'est pas des methodes imbriquees . puisque nbrVoiture est une variable globale donc a chaque iteration les valeurs du tableau doivent incrementer de 1. le resultat que je voudrais voir est
    1
    1
    1
    1
    2
    2
    2
    2
    3
    etc
    mais il m'affiche
    1
    1
    1
    1
    1
    1
    1
    etc
    merci de me poster des solutions si vous en avez
    Mehdi Feki : Modérateur .Net

  4. #4
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Non, je ne met pas en doute le fait que ce soit ton code, mais plutot le fait que tu as recopié ton code pour le poster (parcequ'il est plein de fautes )

    Pour en revenir a ton probleme, je crois que tu ne comprends pas tout a fait le fonctionnement du fork.

    Lorsque tu crées un processus fils a l'aide de fork, il y a duplication des variables, du code, des descripteurs de fichiers ouverts, etc... (et pas partage, attention ! )
    Donc, ce qui se passe, c est que chaque processus se retrouve avec une copie de ton tableau initialisé à 0, et que chacun d'eux fera ++ sur leur propre tableau : ils afficheront donc tous un tableau rempli de 1 !

    Le seul moyen que tu as de faire en sorte que ce soit le meme tableau qui soit partagé est d'employer une memoire partagée, et de mettre ton tableau dedans. Pour ce faire, je te renvoie au man des fonctions shmget, shmat, etc....

    ++
    Pouic
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  5. #5
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    j'allais poster un msg parceque je me suis rendu compte de ma stupidité mais t'as deja trouvé le probleme. jene suis pas entrain de chercher des excuses
    ca a marché en utilisant pipe le probleme est que j'utilise plusieurs process et normalement dans le programme que je suis entrain de faire la valeur peut etre incrementer et decrementer par plusieurs processus à la fois. Donc il faut lire la variable la modifier et ensuite la remettre dans la pipe . Je crois qu'il faut utilise des semaphore pour la pipe
    enfin je vais essaer cette solution si je rencontre encore des probelemes je vous le ferais savoir
    A+
    Mehdi Feki : Modérateur .Net

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 289
    Points : 342
    Points
    342
    Par défaut
    Si tu veux avoir des exécutions parallèles qui partagent des données, tu peux aussi passer par des threads...

  7. #7
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    salut
    Les processus NE PARTAGENT PAS leurs variables, même globales.
    2 solutions: mettre ton tableau dans un segment de mémoire partagée ou utiliser les threads à la place des processus.

    Et attention aux accès concurrents !

  8. #8
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    merci pour votre soutien.
    La solution que j'ai implementé utilise les pipies
    voila un petit apercu:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    int scPipe;  // le semaphore Pour la concurrence d'acces 
    int tube[2];
     
    main()
    {
    int nbrVoiture[4]={0,0,0,0},temp;
    pipe(tube);
    write(tube[1],nbrVoiture,16);//4 bits X 4 entiers =16 bits
     
    for (i = 0 ; i < 10 ; i++)
         {
          // Cree un processus (une voiture) 
          if ((id = fork()) == -1)
             {
               printf("fork processus voiture principale\n");
               exit(0);
             }
           else
             {
               if (id == 0)
               {
     
    	     srand(getpid());
    	     temp=(int)(4.0*rand()/(RAND_MAX+1.0));
             // c t juste un entier aleatoire entre 0 et 3
     
                      rouler(temp);
     
                 exit(0); // le fils meurt ici
               }
             }
      }
    }
    void rouler(int laVoie)
    {
      int nbrVoiture[4];
      P(scPipe); //puis-je modifier nbrVoitur
    	    read(tube[0],nbrVoiture,16);
    	    nbrVoiture[laVoie]++;
                printf("nombre de voitures dans la voie %d est %d",laVoie,nbrVoiture[laVoie]);
    	    write(tube[1],nbrVoiture,16);
      V(scPipe); //Vas-y au suivant
    }
    j'essayerais mardi de poster la concurrence d'acces a un rond-point
    Mehdi Feki : Modérateur .Net

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2014, 19h26
  2. partager une variable entre les utilisateurs sous aix
    Par Khalid.bounouader dans le forum AIX
    Réponses: 3
    Dernier message: 20/09/2012, 10h51
  3. "partager" une variable entre processus
    Par vever001 dans le forum Débuter
    Réponses: 1
    Dernier message: 03/06/2010, 08h36
  4. Réponses: 4
    Dernier message: 24/02/2009, 13h56
  5. partage d'une variable entre plusieurs threads
    Par baedal dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 27/02/2008, 20h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo