SHMGET(2)          Manuel du programmeur Linux          SHMGET(2)


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

SYNOPSIS
       #include <sys/ipc.h>

       #include <sys/shm.h>

       int shmget(key_t clé, int size, int shmflg);

DESCRIPTION
       shmget()  renvoie  l'identificateur  du segment de mémoire
       partagée associé à la valeur de l'argument clé.   Un  nou­
       veau  segment mémoire, de taille size arrondie au multiple
       supérieur de PAGE_SIZE,  est  créé  si  clé  a  la  valeur
       IPC_PRIVATE  ou si aucun segment de mémoire partagée n'est
       associé à clé, et IPC_CREAT est présent dans shmflg.

       shmflg est composé de :

       IPC_CREAT   pour créer un noveau segment.  Sinon  shmget()
                   recherchera   le   segment   associé   à  clé,
                   vérifiera que l'appelant a  la  permission  de
                   recevoir  l'identifiant  shmid associé au seg­
                   ment, et contrôlera que le segment  n'est  pas
                   détruit.

       IPC_EXCL    est   utilisé  avec  IPC_CREAT  pour  garantir
                   l'échec si le segment existe déjà.

       mode d'accès (les 9 bits de poids faibles)
                   indiquant  les  permissions   pour   le   pro­
                   priétaire, le groupe et les autres.  Actuelle­
                   ment  la  permission  d'exécution  n'est   pas
                   utilisée par le système.

       Si un nouveau segment est créé, les permissions d'accès de
       shmflg sont copiées dans le membre shm_perm de  la  struc­
       ture  shmid_ds  décrivant  le segment. Cette structure est
       définie ainsi :

            struct shmid_ds {
              struct          ipc_perm shm_perm; /* Permissions d'accès       */
              int             shm_segsz;         /* Taille segment en octets  */
              time_t          shm_atime;         /* Heure dernier attachement */
              time_t          shm_dtime;         /* Heure dernier détachement */
              time_t          shm_ctime;         /* Heure dernier changement  */
              unsigned short  shm_cpid;          /* PID du créateur           */
              unsigned short  shm_lpid;          /* PID du dernier opérateur  */
              short           shm_nattch;        /* Nombre d'attachements     */
              /* ------------- Les champs suivants sont prives -------------- */
              unsigned short  shm_npages;        /* Taille segment en pages   */
              unsigned long   *shm_pages;        /* Taille d'une page (?)     */
              struct shm_desc *attaches;         /* Descript. attachements    */



Linux                     15 Avril 1997                         1





SHMGET(2)          Manuel du programmeur Linux          SHMGET(2)


            };

            struct ipc_perm
            {
              key_t  key;
              ushort uid;   /* UID et GID effectifs du propriétaire    */
              ushort gid;
              ushort cuid;  /* UID et GID effectif du créateur         */
              ushort cgid;
              ushort mode;  /* Mode d'accès sur 9 bits de poids faible */
              ushort seq;   /* Numéro de séquence                      */
            };

       De plus, durant la  création,  le  système  initialise  la
       structure shmid_ds 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 conti­
              ennent 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



AUTRES APPELS SYSTÈMES
       fork() Après  un  fork()  le  fils  hérite des segments de
              mémoire partagée.

       exec() Après  un  exec()  tous  les  segments  de  mémoire
              partagée sont détachés (pas détruits).

       exit() Lors  d'un  exit()  tous  les  segments  de mémoire
              partagée sont détachés (pas détruits).


VALEUR RENVOYÉE
       Un identificateur de segment shmid valide est  renvoyé  en
       cas de réussite, sinon -1 est renvoyé et errno contient le
       code d'erreur.

ERREURS
       EINVAL      SHMMIN > size ou size > SHMMAX, ou  size  plus
                   grand que la taille du segment.




Linux                     15 Avril 1997                         2





SHMGET(2)          Manuel du programmeur Linux          SHMGET(2)


       EEXIST      On  a  indiqué IPC_CREAT | IPC_EXCL et le seg­
                   ment existe déjà.

       EIDRM       Le segment est détruit.

       ENOSPC      Tous les ID de mémoire partagée sont utilisés,
                   ou l'allocation d'un segment partagé de taille
                   size  dépasserait  les  limites   de   mémoire
                   partagée du système.

       ENOENT      Aucun   segment   n'est   associé  à  clé,  et
                   IPC_CREAT n'etait pas indiqué.

       EACCES      L'appelant n'a pas les  autorisations  d'accès
                   au segment.

       ENOMEM      Pas assez de mémoire.

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.

       SHMMAX     Taille maximale d'un segment partagé (actuelle­
                  ment 4 Mo).

       SHMMIN     Taille    minimale    d'un   segment   partagé.
                  (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).

       Il n'y a pas de limite pour le nombre de segments partagés
       par processus (sauf SHMMNI).

CONFORMITÉ
       SVr4,   SVID.   SVr4   mentionne  une  condition  d'erreur
       supplémentaire EEXIST. Ni SVr4,  ni  SVID  ne  mentionnent
       l'erreur EIDRM.

BUGS
       Indiquer  à  la  fois  IPC_CREAT  et  IPC_EXCL dans shmflg
       garantit seulement la création d'un  nouveau  segment,  et
       non pas l'exclusivite d'accès à ce segment.





Linux                     15 Avril 1997                         3





SHMGET(2)          Manuel du programmeur Linux          SHMGET(2)


VOIR AUSSI
       ftok(3), ipc(5), shmctl(2), shmat(2), shmdt(2).


TRADUCTION
       Christophe Blaess, 1997.



















































Linux                     15 Avril 1997                         4