Provided by: manpages-fr-dev_3.65d1p1-1_all bug

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.

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

Linux                                            12 février 2013                                        SHMOP(2)