shmop, shmat, shmdt - Opérations sur la mémoire partagée.
La fonction
shmat
attache le segment de mémoire partagée identifié par
shmid
au segment de données du processus appelant.
L'adresse d'attachement est indiquée par
shmaddr
avec les critères suivants :
-
Si
shmaddr
vaut
NULL,
le système essaye de trouver une adresse libre pour attacher
le segment.
-
Si
shmaddr
n'est pas
NULL
et si
SHM_RND
est indiqué dans
shmflg,
l'attachement a lieu à l'adresse
shmaddr
arrondie au multiple inférieur de
SHMLBA.
Sinon
shmaddr
doit être alignée sur une frontière de page, où l'attachement a lieu.
Si
SHM_RDONLY
est indiqué dans
shmflg,
le segment est attaché en lecture seulement, et le processus doit disposer
de la permission de lecture dessus. Sinon le segment est attaché en lecture
et écriture et le processus doit disposer des deux permissions d'accès.
Il n'y a pas de notion d'écriture seule pour les
segments de mémoire partagée.
L'option (spécifique à Linux)
SHM_REMAP
peut être ajoutée dans
shmflg
pour indiquer que la projection du segment doit remplacer une projection
précédente dans l'intervalle commençant en
shmaddr
et s'étendant sur la taille du segment.
(Normalement une erreur
EINVAL
se produirait si une projection existait déjà dans l'intervalle indiqué).
Dans ce cas,
shmaddr
ne doit pas être
NULL.
La valeur
brk
du processus appelant n'est pas altérée par l'attachement. Le segment est
automatiquement détaché quand le processus se termine. Le même segment peut être
attaché à la fois en lecture seule et en lecture/écriture. Il peut également
être attaché en plusieurs endroits de l'espace d'adressage du processus.
Si
shmat
réussit, les membres de la structure
shmid_ds
associée au segment de mémoire partagée sont mis à jour ainsi :
-
shm_atime
correspond à l'heure actuelle.
-
shm_lpid
contient le PID de l'appelant.
-
shm_nattch
est incrémenté de 1
Notez que l'attachement réussit même si le segment de mémoire est
marqué pour destruction.
La fonction
shmdt
détache le segment de mémoire partagée situe à l'adresse indiquée par
shmaddr.
Le segment doit être effectivement attaché, et l'adresse
shmaddr
doit être celle renvoyée précédement par
shmat.
Quand
shmdt
réussit, les membres de la structure
shmid_ds
associée au segment de mémoire partagée sont mis à jour ainsi :
-
shm_dtime
correspond à l'heure actuelle.
-
shm_lpid
contient le PID de l'appelant.
-
shm_nattch
est décrémenté de 1. S'il devient nul, et si le
segment est marqué pour destruction, il est
effectivement détruit.
La région occupée de l'espace d'adressage du processus est
libérée.
Utiliser
shmat
avec
shmaddr
éggale à
NULL
est la manière conseillée, portable, d'attecher un segment de mémoire partagé.
Soyez conscients que le segment attaché de cette manière peut l'être à
des adresses différentes dans les différents processus.
Ainsi, tout pointeur contenu dans la mémoire partagé doit être relatif
(typiquement par rapport au début du segment) et pas
absolu.
Les paramètres système suivant influent sur
shmat :
- SHMLBA
-
Multiple pour l'adresse de début de segment.
Doit être aligné sur une frontière de page.
Pour l'implémentation actuelle,
SHMBLA
à la même valeur que
PAGE_SIZE.
L'implémentation n'a pas de limite intrinsèque pour le nombre maximal de
segment de mémoire partagée par processus.
(
SHMSEG).
SVr4, SVID. SVr4 mentionne une condition d'erreur supplémentaire EMFILE.
Dans SVID-v4 le type de l'argument shmaddr a été modifié de
char *
en
const void *,
et le type de retour de shmat() de
char *
en
void *.
(Les bibliothèques Linux libc4 et libc5 avaient le prototype
char * ,
la GlibC 2 celui
void *).
Christophe Blaess, 1996-2003.