Loading

NOM

       shmget - Allouer un segment de mémoire partagée

SYNOPSIS

       #include <sys/ipc.h>
       #include <sys/shm.h>

       int shmget(key_t key, size_t size, int shmflg);

       shmget() renvoie l’identifiant du segment de mémoire partagée associé à
       la valeur de l’argument key. Un nouveau segment mémoire, de taille size
       arrondie  au  multiple  supérieur  de  PAGE_SIZE,  est créé si key a la
       valeur IPC_PRIVATE ou  si  aucun  segment  de  mémoire  partagée  n’est
       associé à key, et IPC_CREAT est présent dans shmflg.

       Si shmflg contient à la fois les attributs IPC_CREAT et IPC_EXCL, et si
       un segment de mémoire partagée est déjà associé à key, shmget()  échoue
       avec  le  code  d’erreur  EEXIST. Ceci est similaire au comportement de
       open(2) avec la combinaison O_CREAT | O_EXCL.

       shmflg est composé de :

       IPC_CREAT   Créer un  nouveau  segment.  Sinon  shmget()  recherche  le
                   segment  associé  à  key  et  vérifie  que  l’appelant a la
                   permission d’y accéder.

       IPC_EXCL    Utilisé avec IPC_CREAT pour garantir l’échec si le  segment
                   existe déjà.

       mode daccs
                   (les   9   bits  de  poids  faibles)  Permissions  pour  le
                   propriétaire, le groupe et les autres. Ces bits ont le même
                   format  et  la  même  signification  que l’argument mode de
                   open(2). Actuellement la permission d’exécution  n’est  pas
                   utilisée par le système.

       SHM_HUGETLB (depuis Linux 2.6)
                   Allouer le segment en utilisant des pages immenses. Voir le
                   fichier Documentation/vm/hugetlbpage.txt dans  les  sources
                   du noyau pour plus d’informations.

       SHM_NORESERVE (depuis Linux 2.6.15)
                   Cet  attribut  a le même objet que l’attribut MAP_NORESERVE
                   de mmap(2). Ne  pas  réserver  d’espace  de  swap  pour  ce
                   segment.  Lorsque  de  l’espace  en  swap  est  réservé, le
                   système  garantit  qu’il  sera  possible  de  modifier   le
                   segment.  Lorsque  l’espace  en  swap n’est pas réservé, on
                   peut recevoir SIGSEGV lors d’une  écriture  si  la  mémoire
                   physique  est  pleine.  Voir aussi la discussion du fichier
                   /proc/sys/vm/overcommit_memory dans proc(5).

       Si un  nouveau  segment  de  mémoire  partagée  est  créé,  le  système
       initialise   son  contenu  à  zéro,  et  la  structure  shmid_ds  (voir
       shmctl(2)) associée au segment comme suit :

              shm_perm.cuid et  shm_perm.uid  contiennent  l’UID  effectif  de
              l’appelant.

              shm_perm.cgid  et  shm_perm.gid  contiennent  le GID effectif de
              l’appelant.

              Les 9 bits de poids faibles de shm_perm.mode contiennent  les  9
              bits de poids faibles de shmflg.

              shm_segsz prend la valeur size.

              shm_lpid, shm_nattch, shm_atime et shm_dtime sont mis à 0.

              shm_ctime contient l’heure actuelle.

       Si  le  segment  de  mémoire  existe déjà, les permissions d’accès sont
       vérifiées, et un contrôle  a  lieu  pour  voir  s’il  est  marqué  pour
       destruction.

VALEUR RENVOYÉE

       Un  identifiant de segment shmid valide est renvoyé en cas de réussite,
       sinon -1 est renvoyé et errno contient le code d’erreur.

ERREURS

       En cas d’erreur, errno prend l’une des valeurs suivantes :

       EACCES L’appelant n’a pas les autorisations d’accès au segment, et  n’a
              pas la capacité CAP_IPC_OWNER.

       EEXIST shmflg  contient  IPC_CREAT  |  IPC_EXCL  mais le segment existe
              déjà.

       EINVAL Un nouveau segment devait être créé et size < SHMMIN ou  size  >
              SHMMAX,  ou bien un segment associé à key existe, mais sa taille
              est inférieure à size.

       ENFILE La limite du nombre total de fichiers ouverts sur le  système  a
              été atteinte.

       ENOENT Aucun  segment  n’est  associé  à  key, et IPC_CREAT n’était pas
              indiqué.

       ENOMEM Pas assez de mémoire pour allouer le segment.

       ENOSPC Tous  les  identifiants  de  mémoire  partagée   sont   utilisés
              (SHMMNI),  ou  l’allocation  d’un segment partagé de taille size
              dépasserait les limites de mémoire partagée du système (SHMALL).

       EPERM  L’attribut  SHM_HUGETLB  est  indiqué, mais l’appelant n’est pas
              privilégié (ne possède pas la capacité CAP_IPC_LOCK).

CONFORMITÉ

       SVr4, POSIX.1-2001.

       SHM_HUGETLB est spécifique à Linux.

NOTES

       IPC_PRIVATE n’est pas une option mais une  valeur  de  type  key_t.  Si
       cette  valeur  spéciale  est utilisée comme clé, l’appel système ignore
       tout sauf les 9 bits de poids faibles de shmflg et tente  de  créer  un
       nouveau segment.

       Les limites suivantes influent sur l’appel système shmget :

       SHMALL Nombre maximal de pages de mémoire partagée sur le système (sous
              Linux, cette limite peut être lue et modifiée grâce  au  fichier
              /proc/sys/kernel/shmall).

       SHMMAX Taille  maximale,  en  octets, d’un segment partagé (sous Linux,
              cette  limite  peut  être  lue  et  modifiée  grâce  au  fichier
              /proc/sys/kernel/shmmax).

       SHMMIN Taille  minimale,  en  octets,  d’un segment partagé : dépend de
              l’implémentation (actuellement 1 octet, bien que PAGE_SIZE  soit
              la valeur effectivement utilisée).

       SHMMNI Nombre  maximal  de  segments de mémoire partagée sur le système
              (actuellement 4096, mais 128 avant Linux  2.3.99 ;  sous  Linux,
              cette  limite  peut  être  lue  et  modifiée  grâce  au  fichier
              /proc/sys/kernel/shmmni).

       L’implémentation n’a pas de limite spécifique pour le nombre maximal de
       segments partagés par processus (SHMSEG).

   Notes sur Linux
       Jusqu’au  noyau 2.3.30, Linux renvoyait l’erreur EIDRM pour un shmget()
       sur un segment de mémoire marqué pour destruction.

BOGUES

       Le choix du nom IPC_PRIVATE est malheureux, IPC_NEW aurait mieux décrit
       sa fonction.

VOIR AUSSI

       shmat(2),     shmctl(2),     shmdt(2),     ftok(3),    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> ».