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);
DESCRIPTION¶
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 (consultez
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.
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 segments 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.44 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¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Christophe Blaess <
http://www.blaess.fr/christophe/> (1996-2003), Alain
Portal <
http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et
l'équipe francophone de traduction de Debian (2006-2009).
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> ».