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

C Discussion :

Utilisation de la memoire partage


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Par défaut Utilisation de la memoire partage
    Bonjour,

    J ai un programme qui fait plusieurs fils et j aimerais que chacun des fils puisse modifier la valeur de plusieurs variables.

    J ai d abord pense ( naivement) a declarer mes variables en globale. Mais bien sur chaque variable est recopie dans chacun des processus et ne designe donc pas les memes adresse memoires...

    Je pense que la seule solution est de creer un segment de memoire partage. Mais des utilisations que j ai pu en voir, on ne peut mettre qu une valeur dans un segment et cela m obligerai a declarer pas mal de segments...

    Est ce que vous connaissez un moyen de mettre plusieurs valeurs ds un segment de memoire partage et de pouvoir recuperer (ou modifier) une valeur precise ?

    Merci d avance !

    (Si vous avez une autre solution a mon probleme je suis preneur aussi...)

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Et pourquoi pas projeter une structure en mémoire?

  3. #3
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    La mémoire partagée est une zone mémoire donc tu as autant de place que le système veut bien te donner. Ce que tu fais de cette zone est ensuite à toi de voir.

    Tu pourras y mettre un tableau, une liste chaînée, etc...

    Jc

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Par défaut
    Ah oui c bien ca !

    Mais ca donnerait quoi ? ca ? :
    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
     
     
    typedef struct mastruct{
                                      int argument1;
                                      int argument2;
                                      int argument3;
                                    }
    main(){
     
    int shmid ; // l'identificateur de la memoire partagee 
    key_t clef ; // la clef associee au segment
    char* mem;
    struct mastruct mesarg;
     
    mesarg.argument1 = 1;
    mesarg.argument2 = 2;
    mesarg.argument3 = 3;
     
     
    clef = ftok(name,(key_t) cle) ;
     
    shmid = shmget(clef,sizeof(mastruct),IPC_CREAT|IPC_EXCL|SHM_R|SHM_W ) ;
     
    if ( shmid== -1 ) {
        perror("La creation du segment de memoire partage a echouee") ;
        exit(1) ;}
     
    switch(fork){
     
           case 0 :  
                      mem = shmat(shmid,0,flag);
                      *mem = mesarg; //????????????
     
                            ...
    Et pour recuperer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    processus b(){
     
            char* mem;
            struct mastruct mesarg2;
     
            mem = shmat(shmid,0,flag);
            mesarg2 = *mem;// ?????
                   ...
    Je sens bien que ca va pas etre aussi simple ...

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Treuze
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    processus b(){
     
            char* mem;
            struct mastruct mesarg2;
     
            mem = shmat(shmid,0,flag);
            mesarg2 = *mem;// ?????
                   ...
    Pourquoi utiliser un char * ?
    Tu peux directement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    processus b ()
    {
      struct mastruct mesarg2;
     
      mesarg2 = shmat(shmid,0,flag);
    }
    man shmget
    man shmat

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Par défaut
    Tiens ... sur linux-kheops , il renvoie un char* ...

    Bien le merci ! je vais essayer ts ca

  7. #7
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Par défaut
    Pourquoi utiliser un char * ?
    Tu peux directement faire :
    Code :
    processus b ()
    {
    struct mastruct mesarg2;

    mesarg2 = shmat(shmid,0,flag);
    }

    incompatible types inassignement

    C est bien un char* qui est renoye , il va falloir revoir le man du site ...

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

Discussions similaires

  1. Detacher la memoire partage
    Par Treuze dans le forum C
    Réponses: 3
    Dernier message: 19/06/2006, 17h34
  2. Probleme avec memoire partage
    Par Treuze dans le forum C
    Réponses: 3
    Dernier message: 12/06/2006, 13h32
  3. segment de memoire partagé en C
    Par thierry_b dans le forum C
    Réponses: 2
    Dernier message: 29/11/2005, 21h30
  4. [segment de memoire partagée]
    Par pitit777 dans le forum C
    Réponses: 4
    Dernier message: 26/11/2005, 14h47
  5. Réponses: 13
    Dernier message: 05/05/2004, 19h09

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