Date création : 27-03-2008 20:23:44
 Vous êtes dans : GNU/Linux Astuces / Pages man [Section2 - Appels système]
SHMOP
Index
- NOM
- SYNOPSIS
- DESCRIPTION
- AUTRES APPELS SYSTÈMES
- VALEUR RENVOYÉE
- ERREURS
- NOTES
- CONFORMITÉ
- VOIR AUSSI
- TRADUCTION
NOM
shmop - 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 (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.
AUTRES APPELS SYSTÈMES
- fork()
-
Après un fork() le fils hérite des segments de mémoire partagée.
- exec()
-
Après un exec() tous les segments de mémoire partagée sont détachés (pas
détruits).
- exit()
-
Lors d'un exit() tous les segments de mémoire partagée sont détachés (pas
détruits).
VALEUR RENVOYÉE
Si elles 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 lor de
brk(), 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.
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).
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 *).
VOIR AUSSI
brk(2), mmap(2), shmctl(2), shmget(2), capabilities(7),
svipc(7)
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.
La traduction de cette page de manuel est basée sur les traductions
disponibles sur http://manpagesfr.free.fr/,
mais est gérée par l'équipe francophone de traduction de Debian
au travers de la liste de discussion debian-l10n-french.
Veuillez signaler toute erreur de traduction 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> ».
|