SHMOP(2)           Manuel du programmeur Linux           SHMOP(2)


NOM
       shmop,  shmat, shmdt - Opérations sur la mémoire partagée.

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

       char *shmat ( int shmid, char *shmaddr, int shmflg )

       int shmdt ( char *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 0, le système essaye de trouver une
              zone libre dans l'intervalle  1  -  1.5Go  en  com­
              mençant  par  l'adresse la plus haute et en descen­
              dant jusqu'à trouver l'emplacement adéquat.

              Si shmaddr  n'est  pas  nulle  et  si  SHM_RND  est
              indiqué   dans   shmflg,  l'attachement  a  lieu  à
              l'adresse shmaddr arrondie au multiple inférieur de
              SHMLBA.   Si SHM_RND n'est pas indiqué shmaddr doit
              être  alignée  sur  une  frontière  de   page,   et
              l'attachement a lieu à cette adresse.

       Si  SHM_RDONLY  est  indiqué  dans  shmflg, le segment est
       attaché en lecture seulement, et le  processus  doit  dis­
       poser  de  la permission de lecture dessus.  Sinon le seg­
       ment 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.

       La  valeur brk 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.

       Si shmat réussit, les membres  de  la  structure  shmid_ds
       associée  au  segment  de mémoire partagée sont mis à jour
       ainsi :

              shm_atime correspond à l'heure actuelle.

              shm_lpid contient le PID de l'appelant.



Linux                     15 Avril 1997                         1





SHMOP(2)           Manuel du programmeur Linux           SHMOP(2)


              shm_nattch est incrémenté de 1

       Notez que l'attachement réussit  même  si  le  segment  de
       mémoire est marqué pour destruction.

       La  fonction  shmdt détache le segment de mémoire partagée
       situe à l'adresse indiquée par shmaddr.  Le  segment  doit
       être effectivement attaché, et l'adresse shmaddr doit être
       celle renvoyée précédement 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.

       La région occupée de l'espace d'adressage du processus est
       libérée.


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
       Les deux fonctions renvoient -1 si elles échouent,  auquel
       cas  errno contient le code d'erreur.  Sinon shmat renvoie
       l'adresse d'attachement du segment de mémoire partagée, et
       shmdt renvoie 0.

ERREURS
       shmat:

       EACCES     L'appelant  n'a  pas  les  permissions  d'accès
                  nécessaires pour l'attachement.

       EINVAL     shmid est invalide, shmaddr est mal alignée  ou
                  l'attachement a échoué sur brk.

       ENOMEM     Pas assez de mémoire pour le système.




Linux                     15 Avril 1997                         2





SHMOP(2)           Manuel du programmeur Linux           SHMOP(2)


       shmdt:

       EINVAL.
              Pas de segment attaché à l'adresse shmaddr.

NOTES
       Au  cours d'un fork(2) le fils hérite de tous les segments
       attachés.

       Les segments sont détachés durant un execve(2)


       Il n'y a pas de limite au nombre de  segments  de  mémoire
       attachés par processus.

CONFORMITÉ
       SVr4,   SVID.   SVr4   mentionne  une  condition  d'erreur
       supplémentaire EMFILE.

VOIR AUSSI
       ipc(5), shmctl(2), shmget(2).


TRADUCTION
       Christophe Blaess, 1997.
































Linux                     15 Avril 1997                         3