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

NOM

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

SYNOPSIS

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

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

DESCRIPTION

       shmget() renvoie l'identifiant du segment de mémoire partagée System V 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 d'accès
                   (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.  Consultez  le  fichier
                   Documentation/vm/hugetlbpage.txt  dans  les  sources  du noyau Linux 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.  Consultez  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 (consultez 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

       En cas de succès, un identifiant de mémoire partagée valide est renvoyé. En cas  d'erreur,
       -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

       L'inclusion de <sys/types.h> et <sys/ipc.h> n'est  pas  nécessaire  sous  Linux  et  n'est
       exigée  par  aucune  version  de  POSIX.  Cependant,  certaines  implémentations anciennes
       nécessitent l'inclusion de ces  fichiers  d'en-tête,  et  le  SVID  documente  aussi  leur
       inclusion.  Les  applications  ayant  pour  but  d'être  portables  pourraient inclure ces
       fichiers d'en-tête.

       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. Depuis Linux 2.2, cette
              limite vaut par défaut :

                  SHMMAX / PAGE_SIZE * (SHMMNI / 16)

              Pour  une  page  de  mémoire  de  4 ko, cette formule produit (depuis Linux 2.4) la
              valeur 2^20 (2 097 152).

              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é. Depuis Linux 2.2, cette limite
              vaut par défaut 0x2000000 (32 Mo).

              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.  Avec  Linux 2.2,
              cette  limite valait 128 par défaut. Depuis Linux 2.4, cette valeur par défaut vaut
              4096.

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