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