Provided by: manpages-fr-dev_3.32d0.2p4-1_all bug

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.

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 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.32  du  projet  man-pages
       Linux.  Une description du projet et des instructions pour signaler des
       anomalies      peuvent      être       trouvées       à       l'adresse
       <URL:http://www.kernel.org/doc/man-pages/>.

TRADUCTION

       Depuis  2010,  cette  traduction est maintenue à l'aide de l'outil po4a
       <URL:http://po4a.alioth.debian.org/>   par   l'équipe   de   traduction
       francophone        au        sein        du       projet       perkamon
       <URL:http://perkamon.alioth.debian.org/>.

       Christophe Blaess  <URL:http://www.blaess.fr/christophe/>  (1996-2003),
       Alain   Portal   <URL: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> ».