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 :

Syscall - shared memory


Sujet :

Linux

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 71
    Points
    71
    Par défaut Syscall - shared memory
    hello tout le monde

    voilà je vais bientot avoir un projet a remettre en c avec des syscall unix, et le principal est d'utilisé une shared memory. Bien sur comme tout bon unixien j'ai fouillé dans le man 2, et la à je trouve ce qu'il me faut... Tout malheureusement non, avec ce que j'ai trouvé dans le man je peux creer une mémoire partagé avec shmget(), je peux l'attaché à un process, la détachée, et la controllé... il me manque juste à savoir comment on l'utilise. et là c'est mon soucis tout ce que j'ai réussi a trouvé c'est qu'il y avait une fonciton shmop(), mais alors sur comment l'utilisé rien que dalle nada...

    En résumé si quelqu'un pouvait me donné un brin d'explication de comment utilisé ma shared mémory ce serait vraiment sympa

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Ca se passe généralement en deux temps : création et attachement.

    La création avec shmget te renvoie un identificateur pour ta mémoire partagée.

    L'attachement avec shmat te permet de récupérer un pointeur vers la mémoire partagée.

    Voilà un petit bout de code d'un récent projet universitaire :

    Voilà une variable que je veux partager :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    struct monde * Monde;
    Ma structure monde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct monde
    {
      int tab[LARG_X][LARG_Y];
    };
    Et le code qui permet de créer et d'attacher la mémoire partagée :

    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
     
      /* Initialisation du protocole IPC */
      if( (cle_monde = ftok("/tmp",getpid())) == -1 )
        {
          perror("ftok");
          exit(EXIT_FAILURE);
        }
     
      /* La mémoire partagé */
      if( (shmid_monde = shmget(cle_monde, sizeof( struct monde) , IPC_CREAT | IPC_EXCL | 0666 )) ==  -1 )
        {
          perror("shmget");
          exit(EXIT_FAILURE);
        }
     
      if( (Monde = (struct monde *) shmat( shmid_monde, NULL , 0 )) == (void *) -1 )
        {
          perror("shmat");
          exit(EXIT_FAILURE);
        }
    A la fin de ces lignes, la mémoire partagée est accèdée par ma variable Monde comme s'il s'agissait d'une variable normale.

    Attention cependant, lorsque tu utilises une mémoire partagée il faut très souvent (tout le temps) mettre en place un système de protection d'accès (en général, on utilise les sémaphores).

    Juste une précision, il y a quelques bricolages (encapsulation dans une structure, cast du retour de shmat, ...), ceci est du à la (vieille) version de gcc utilisée et des headers du système (ma fonction shmat par exemple renvoie un char* et pas un void* comme ça se fait maintenant. )

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 71
    Points
    71
    Par défaut
    ah ca doit être ca que j'ai pas compris, j'avais bien compris que shmat renvoyait l'adresse de la shared mémory, mais je savais pas que son utilité allait plus loin que ca (mis a part pour le détatch).

    Mais donc en gros si j'ai bien compris lorsque tu modifier un champ de ta variable Monde, tu écris qq chose directement dans ta shared mémory

    enfin merci pour ton explication ^_^

    mais alors ce truc de shmop() c'est quoi?

  4. #4
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Mais donc en gros si j'ai bien compris lorsque tu modifier un champ de ta variable Monde, tu écris qq chose directement dans ta shared mémory
    Exact.

    mais alors ce truc de shmop() c'est quoi?
    Connais pas dsl ... Mais à mon avis, shmop est une manpage générique qui résume shmat et shmdt ... En tout cas, google ne me renvoie que ce genre de page et mon man ne la mentionne pas.

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 71
    Points
    71
    Par défaut
    mmm ba j'avais ca aussi, je fesais man 2 shmop, et pouf je tombais sur la page de shmat et shmdt.

    Enfin merci quand même pour le complément l'info

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

Discussions similaires

  1. ORA-27101: shared memory realm does not exist
    Par Mella dans le forum Connexions aux bases de données
    Réponses: 21
    Dernier message: 13/01/2013, 15h06
  2. ORA-27101: shared memory realm does not exist.
    Par mogweys dans le forum Oracle
    Réponses: 4
    Dernier message: 20/06/2006, 12h56
  3. shared memory entre ordi c++
    Par yaronillouz dans le forum C++
    Réponses: 9
    Dernier message: 20/02/2006, 22h02
  4. Réponses: 10
    Dernier message: 07/02/2006, 13h22
  5. Share memory
    Par beLz dans le forum C
    Réponses: 5
    Dernier message: 21/12/2004, 00h50

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