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 */ }