Loading

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> ».