NOM
shmat, shmdt - Opérations sur la mémoire partagée
SYNOPSIS
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmdt(const void *shmaddr);
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(2) 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.
Quand shmat() réussit, les membres de la structure shmid_ds associée au
segment de mémoire partagée (voir shmctl(2)) 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.
La fonction shmdt() détache le segment de mémoire partagée situé à
l’adresse indiquée par shmaddr. Le segment doit être effectivement
attaché, et l’adresse shmaddr doit être celle renvoyée précédemment 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.
Après un fork(2) le fils hérite des segments de mémoire partagée.
Après un execve(2) tous les segments de mémoire partagée sont détachés
(pas détruits).
Lors d’un _exit(2) tous les segments de mémoire partagée sont détachés
(pas détruits).
VALEUR RENVOYÉE
S’il réussit, shmat() renvoie l’adresse d’attachement du segment de
mémoire partagée. En cas d’échec (void *) -1 est renvoyé, et errno
contient le code d’erreur.
shmdt() renvoie zéro s’il réussit et -1 s’il échoue et écrit la cause
de l’erreur dans errno.
ERREURS
Quand shmat() échoue, errno prend l’une des valeurs suivantes :
EACCES L’appelant n’a pas les permissions d’accès nécessaires pour
l’attachement, et n’a pas la capacité CAP_IPC_OWNER.
EINVAL shmid est invalide, shmaddr est mal alignée (c’est-à-dire pas
alignée sur une page et SHM_RND n’a pas été précisé) ou
invalide, échec lors de l’attachement à shmaddr, ou SHM_REMAP a
été réclamé et shmaddr est NULL.
ENOMEM Pas assez de mémoire pour le système.
Quand shmdt() échoue, errno prend l’une des valeurs suivantes :
EINVAL Aucun segment de mémoire partagée n’est attaché à l’adresse
shmaddr, ou bien shmaddr n’est pas un multiple de la taille de
page.
CONFORMITÉ
SVr4, POSIX.1-2001.
Dans SVID 3 (ou peut être auparavant) 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 avec void *).
NOTES
Utiliser shmat() avec shmaddr égale à NULL est la manière conseillée,
portable, d’attacher un segment de mémoire partagée. 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ée doit être relatif (typiquement par rapport au
début du segment) et pas absolu.
Sous Linux, il est possible d’attacher un segment de mémoire partagée
qui est déjà marqué pour effacement. Cependant, ce comportement n’est
pas décrit par POSIX.1-2001, et beaucoup d’autres implémentations ne le
permettent pas.
Les paramètres système suivants 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,
SHMLBA à 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).
VOIR AUSSI
brk(2), mmap(2), shmctl(2), shmget(2), capabilities(7),
shm_overview(7), svipc(7)
COLOPHON
Cette page fait partie de la publication 3.23 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».