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

NOM

       shmat, shmdt - Operations sur la memoire partagee

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 memoire partagee identifie
       par shmid au  segment  de  donnees  du  processus  appelant.  L'adresse
       d'attachement est indiquee par shmaddr avec les criteres suivants :

       Si  shmaddr  vaut  NULL, le systeme essaye de trouver une adresse libre
       pour attacher le segment.

       Si shmaddr n'est pas NULL  et  si  SHM_RND  est  indique  dans  shmflg,
       l'attachement a lieu a l'adresse shmaddr arrondie au multiple inferieur
       de SHMLBA. Sinon shmaddr doit etre alignee sur une frontiere  de  page,
       ou l'attachement a lieu.

       Si  SHM_RDONLY  est  indique  dans  shmflg,  le  segment est attache en
       lecture seulement, et le processus doit disposer de  la  permission  de
       lecture  dessus. Sinon le segment est attache en lecture et ecriture et
       le processus doit disposer des deux permissions d'acces. Il n'y  a  pas
       de notion d'ecriture seule pour les segments de memoire partagee.

       L'option  (specifique  a Linux) SHM_REMAP peut etre ajoutee dans shmflg
       pour  indiquer  que  la  projection  du  segment  doit  remplacer   une
       projection  precedente  dans  l'intervalle  commencant  en  shmaddr  et
       s'etendant sur la taille du segment. (Normalement une erreur EINVAL  se
       produirait  si une projection existait deja dans l'intervalle indique.)
       Dans ce cas, shmaddr ne doit pas etre NULL.

       La  valeur  brk(2)  du  processus  appelant  n'est  pas   alteree   par
       l'attachement.   Le   segment  est  automatiquement  detache  quand  le
       processus se termine. Le meme segment peut etre attache a  la  fois  en
       lecture seule et en lecture/ecriture. Il peut egalement etre attache en
       plusieurs endroits de l'espace d'adressage du processus.

       Quand shmat() reussit, les membres de la structure shmid_ds associee au
       segment  de  memoire  partagee  (consultez  shmctl(2))  sont mis a jour
       ainsi :

              shm_atime correspond a l'heure actuelle.

              shm_lpid contient le PID de l'appelant.

              shm_nattch est incremente de 1.

       La fonction shmdt() detache le segment  de  memoire  partagee  situe  a
       l'adresse  indiquee  par  shmaddr.  Le  segment doit etre effectivement
       attache, et l'adresse shmaddr doit etre celle renvoyee precedemment par
       shmat().

       Quand shmdt() reussit, les membres de la structure shmid_ds associee au
       segment de memoire partagee sont mis a jour ainsi :

              shm_dtime correspond a l'heure actuelle.

              shm_lpid contient le PID de l'appelant.

              shm_nattch est decremente de 1.  S'il  devient  nul,  et  si  le
              segment  est  marque  pour  destruction,  il  est  effectivement
              detruit.

       Apres un fork(2) le fils herite des segments de memoire partagee.

       Apres un execve(2) tous les segments de memoire partagee sont  detaches
       (pas detruits).

       Lors  d'un _exit(2) tous les segments de memoire partagee sont detaches
       (pas detruits).

VALEUR RENVOY'EE

       S'il reussit, shmat() renvoie l'adresse  d'attachement  du  segment  de
       memoire  partagee.  En  cas  d'echec  (void *) -1 est renvoye, et errno
       contient le code d'erreur.

       shmdt() renvoie zero s'il reussit et -1 s'il echoue et ecrit  la  cause
       de l'erreur dans errno.

ERREURS

       Quand shmat() echoue, errno prend l'une des valeurs suivantes :

       EACCES L'appelant  n'a  pas  les  permissions  d'acces necessaires pour
              l'attachement, et n'a pas la capacite CAP_IPC_OWNER.

       EINVAL shmid est invalide, shmaddr est mal  alignee  (c'est-a-dire  pas
              alignee  sur  une  page  et  SHM_RND  n'a  pas  ete  precise) ou
              invalide, echec lors de l'attachement a shmaddr, ou SHM_REMAP  a
              ete reclame et shmaddr est NULL.

       ENOMEM Pas assez de memoire pour le systeme.

       Quand shmdt() echoue, errno prend l'une des valeurs suivantes :

       EINVAL Aucun  segment  de  memoire  partagee  n'est attache a l'adresse
              shmaddr, ou bien shmaddr n'est pas un multiple de la  taille  de
              page.

CONFORMIT'E

       SVr4, POSIX.1-2001.

       Dans  SVID  3 (ou peut etre auparavant) le type de l'argument shmaddr a
       ete modifie de char * en const void *, et le type de retour de  shmat()
       de char * en void *. (Les bibliotheques Linux libc4 et libc5 avaient le
       prototype char *, la glibc 2 celui avec void *).

NOTES

       Utiliser shmat() avec shmaddr egale a NULL est la  maniere  conseillee,
       portable,  d'attacher  un segment de memoire partagee. Soyez conscients
       que le segment attache de cette maniere  peut  l'etre  a  des  adresses
       differentes dans les differents processus. Ainsi, tout pointeur contenu
       dans la memoire partagee doit etre relatif (typiquement par rapport  au
       debut du segment) et pas absolu.

       Sous  Linux,  il est possible d'attacher un segment de memoire partagee
       qui est deja marque pour effacement. Cependant, ce  comportement  n'est
       pas decrit par POSIX.1-2001, et beaucoup d'autres implementations ne le
       permettent pas.

       Les parametres systeme suivants influent sur shmat() :

       SHMLBA Multiple pour l'adresse de debut de segment.  Doit  etre  aligne
              sur  une  frontiere  de  page.  Pour  l'implementation actuelle,
              SHMLBA a la meme valeur que PAGE_SIZE.

       L'implementation n'a pas de limite intrinseque pour le  nombre  maximal
       de segments de memoire partagee 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      etre       trouvees       a       l'adresse
       <URL:http://www.kernel.org/doc/man-pages/>.

TRADUCTION

       Depuis  2010,  cette  traduction est maintenue a l'aide de l'outil po4a
       <URL:http://po4a.alioth.debian.org/>   par   l'equipe   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'equipe francophone de traduction de Debian (2006-2009).

       Veuillez  signaler  toute  erreur   de   traduction   en   ecrivant   a
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

       Vous pouvez toujours avoir acces a la version anglaise de  ce  document
       en utilisant la commande << man -L C <section> <page_de_man> >>.