NOM¶
shmat, shmdt - Opérations sur la mémoire partagée
System V
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
System V 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.
- EIDRM
- shmid pointe sur un segment détruit.
- 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.65 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> ».