Next: Sécurité Up: Les segments de mémoire Previous: Les segments de mémoire

Utilisation des segments de mémoire partagée

La primitive shmget:

#include <sys/shm.h>
int shmget(key_t cle, int taille, int options);

Création/ouverture d'un segment de taille octets, si le segment existe déjà il faut que la taille soit inférieure ou égale à celle du segment que l'on veut ouvrir.

La primitive d'attachement shmat:

#include <sys/shm.h>
void  *shmat(int dipc, const void *adr, int option);

Cette primitive est une demande d'attachement du segment dipc à l'adresse adr de l'espace d'adressage du processus. La valeur de retour est l'adresse où l'attachement a été efffectivement réalisé, c'est-à-dire celle attribuée au premier octet du segment (ou -1 en cas d'échec).

Le choix du paramètre adr est délicat. Il faut en effet respecter un certain nombre de conditions, variables d'une machine à l'autre: l'alignement, la plage d'adresses autorisées aux segments de mémoire partagée, les adresses de pages virtuelles et physiques etc. On utilisera de preférence adr = NULL, c'est-à-dire qu'on laisse le soin au système de sélectionner l'adresse.

Si l'on veut quand même positionner le segment dans une certaine zone de l'espace d'adressage, on utilise l'indicateur SHM_RND dans le paramètre options pour que le système choisisse une adresse valable la plus proche possible de adr.

Remarques: l'attachement multiple par un même processus n'est pas autorisé sur tous les systèmes.
L'attachement n'est valable que dans un seul processus, l'adresse d'attachement n'a aucune raison d'être identique dans tous les processus, on ne pourra donc pas utiliser de structures chaînées dans le segment de mémoire partagée.

La primitve de détachement:

#include <sys/shm.h>
int shmdt (const void *adr);
détache le segment attaché à l'adresse adr par shmat.

La primitive de contrôle:

#include <sys/shm.h>
int shmctl(int dipc, int op, struct shmid_ds *pshmid);
est extrêmement simple, les seules opérations sont celles qui sont génériques à tous les IPC.
IPC_STAT
lecture de la structure shmid_ds
IPC_SET
positionnement de la structure shmid_ds
IPC_RMID
permet de détruire le segment (super-utilisateur, ou créateur du sémaphore)

Une autre technique de partage de mémoire existe, avec la projection de fichier en mémoire (voir section 9.5).

Next: Sécurité Up: Les segments de mémoire Previous: Les segments de mémoire

Dominique REVUZ
Mon Feb 2 12:10:31 MET 1998
Une Bug Un mail Merci