next up previous contents
Next: Sémaphores Up: Mémoire commune Previous: Mémoire commune   Contents

Implémentation

Les fonctions utilisées pour contrôler la mémoire partagée sont très semblables à celles utilisées pour la gestion des queues de messages.

La fonction int shmget(key_t key, int size, int shmflg); retourne l'identifiant du segment associé à la clef key ou -1 en cas d'erreur. Le flag shmflg sert à déterminer les droits d'accès au segment et le mode de création (IPC_CREAT et IPC_EXCL). Dans le cas où le flag IPC_CREAT est mis, ou que IPC_PRIVATE est positionné, un nouveau segment de taille size est créé.

[linewidth=1pt,fillstyle=solid,shadow=true](-0.5,0)(17.5,-8)

L'exemple suivant montre l'emploi de shmget() pour créer un segment mémoire partagée de 100 octets associé à la clef 1 et accessible par tous les utilisateurs.


#include <sys/types.h> <sys/ipc.h> <sys/shm.h> 
#include <stdio.h> <stdlib.h> <string.h>

void main(int arc, char * argv[])
{
   int shmid;
   if ((shmid=shmget((key_t)1,100,IPC\_CREAT+0666))==-1)
   {
      perror("shmget");
      exit(1);
   }
   printf("%s%d\n","L'identifiant memoire est ",shmid);
}

La fonction int shmctl(int shmid, int cmd, struct shmid_ds *buf); est utiliser pour manipuler la structure de données associée au segment mémoire.

Si cmd =

La fonction char *shmat( int shmid, char *shmaddr, int shmflg) attache le segment mémoire identifié par shmid au segment de données du processus. Ce mécanisme s'effectue différemment suivant que shmflg prend la valeur :

La fonction int shmdt ( char *shmaddr) détache le segment mémoire situé à l'adresse shmaddr (adresse fournie par shmat().

L'exemple suivant montre comment 2 processus peuvent utiliser la mémoire commune pour se transmettre des messages. Les 2 processus partagent le segment mémoire associé à la clef 1 et utilisent le premier octet comme indicateur de disponibilité. La longueur du message est limitée par la taille du segment.

Pour utiliser cet exemple, il faut au préalable lancer le programme utilisant shmget() présenté plus haut. Lancer ensuite shm1 puis shm2.

Le processus associé à shm1 va placer un message dans le segment mémoire et attendre qu'il soit lu. Le processus associé à shm2 attend qu'un message soit disponible, le récupère, remet à jour l'indicateur, puis affiche le message.

[linewidth=1pt,fillstyle=solid,shadow=true](-0.5,0)(17.5,-11)


/* shm1.c */
#include <sys/types.h> <sys/ipc.h> <sys/shm.h> 

void main(int arc, char * argv[])
{
   int shmid;
   char *buf;
   char *msg="Ceci est un message transmis par la mémoire commune";

   if ((shmid=shmget((key_t)1,0,0))==-1) {
      perror("shmget");
      exit(1); }
   if ((buf=shmat(shmid,0,0))== (char *)-1) {
      perror("shmat");
      exit(1); }
   *buf=0;              /* segment libre */
   strcpy(buf+1,msg);   /* transmission du message */
   *buf=1;              /* message disponible */
   while(*buf);         /* attend que le segment soit libere */
   shmdt(buf);          /* detachement */
}

[linewidth=1pt,fillstyle=solid,shadow=true](-0.5,0)(17.5,-11)


/* shm2.c */
#include <sys/types.h> <sys/ipc.h> <sys/shm.h> 

void main(int arc, char * argv[])
{
   int shmid;
   char *buf;
   char msg[100];

   if ((shmid=shmget((key_t)1,0,0))==-1) {
      perror("shmget");
      exit(1); }
   if ((buf=shmat(shmid,0,0))== (char *)-1) {
      perror("shmat");
      exit(1); }
   while(*buf!=1);      /* attend que le message soit disponible */
   strcpy(msg,buf+&);   /* lecture message */
   *buf=0;              /* segment libre */
   printf("%s\n",msg);  /* affichage du message */
   shmdt(buf);          /* detachement */
}


next up previous contents
Next: Sémaphores Up: Mémoire commune Previous: Mémoire commune   Contents
Arnaud Revel
2001-11-26