SHMGET(2)

NOM
shmget - Allouer un segment de memoire partagee.

SYNOPSIS
#include <sys/ipc.h>

#include <sys/shm.h>

int shmget(key_t cle, int size, int shmflg);

DESCRIPTION
shmget() renvoie l'identificateur du segment de memoire partagee associe a la valeur de l'argument cle. Un nouveau segment memoire, de taille size arrondie au multiple superieur de PAGE_SIZE, est cree si cle a la valeur IPC_PRIVATE ou si aucun segment de memoire partagee n'est associe a cle, et IPC_CREAT est present dans shmflg.

shmflg est compose de :

IPC_CREAT
    pour creer un noveau segment. Sinon shmget() recherchera le segment associe a cle, verifiera que l'appelant a la permission de recevoir l'identifiant shmid associe au segment, et controlera que le segment n'est pas detruit.

IPC_EXCL
    est utilise avec IPC_CREAT pour garantir l'echec si le segment existe deja.

mode d'acces (les 9 bits de poids faibles)
    indiquant les permissions pour le proprietaire, le groupe et les autres. Actuellement la permission d'execution n'est pas utilisee par le systeme.

Si un nouveau segment est cree, les permissions d'acces de shmflg sont copiees dans le membre shm_perm de la structure shmid_ds decrivant le segment. Cette structure est definie ainsi :

struct shmid_ds {
  struct          ipc_perm shm_perm; /* Permissions d'acces       */
  int             shm_segsz;         /* Taille segment en octets  */
  time_t          shm_atime;         /* Heure dernier attachement */
  time_t          shm_dtime;         /* Heure dernier detachement */
  time_t          shm_ctime;         /* Heure dernier changement  */
  unsigned short  shm_cpid;          /* PID du createur           */
  unsigned short  shm_lpid;          /* PID du dernier operateur  */
  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    */
};

struct ipc_perm
{
  key_t  key;
  ushort uid;   /* UID et GID effectifs du proprietaire    */
  ushort gid;
  ushort cuid;  /* UID et GID effectif du createur         */
  ushort cgid;
  ushort mode;  /* Mode d'acces sur 9 bits de poids faible */
  ushort seq;   /* numero de sequence                      */
};

De plus, durant la creation, le systeme initialise la structure shmid_ds associee au segment comme suit :

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

    shm_perm.cgid and 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 a 0.

    shm_ctime contient l'heure actuelle

AUTRES APPELS SYSTEMES

fork()
    Apres un fork() le fils herite des segments de memoire partagee.

exec()
    Apres un exec() tous les segments de memoire partagee sont detaches (pas detruits).

exit()
    Lors d'un exit() tous les segments de memoire partagee sont detaches (pas detruits).

VALEUR RENVOYEE
Un identificateur de segment shmid valide est renvoye en cas de reussite, sinon -1 est renvoye et errno contient le code d'erreur.

ERREURS

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

EEXIST
    On a indique IPC_CREAT | IPC_EXCL et le segment existe deja.

EIDRM
    Le segment est detruit.

ENOSPC
    Tous les ID de memoire partagee sont utilises, ou l'allocation d'un segment partage de taille size depasserait les limites de memoire partagee du systeme.

ENOENT
    Aucun segment n'est associe a cle, et IPC_CREAT n'etait pas indique.

EACCES
    L'appelant n'a pas les autorisations d'acces au segment.

ENOMEM
    Pas assez de memoire.

NOTES
IPC_PRIVATE n'est pas une option mais une valeur de type key_t. Si cette valeur speciale est utilisee comme cle, l'appel systeme ignore tout sauf les 9 bits de poids faibles de shmflg et tente de creer un nouveau segment.

Les limites suivantes influent sur l'appel systeme shmget :

SHMALL
    Nombre maximal de pages de memoire partagee sur le systeme.

SHMMAX
    Taille maximale d'un segment partage (actuellement 4 Mo).

SHMMIN
    Taille minimale d'un segment partage. (actuellement 1 octet, bien que PAGE_SIZE soit la valeur effectivement utilisee).

SHMMNI
    Nombre maximal de segments de memoire partagee sur le systeme (actuellement 4096).

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

CONFORMITE
SVr4, SVID. SVr4 mentionne une condition d'erreur supplementaire EEXIST. Ni SVr4, ni SVID ne mentionnent l'erreur EIDRM.

BUGS
Indiquer a la fois IPC_CREAT et IPC_EXCL dans shmflg garantit seulement la creation d'un nouveau segment, et non pas l'exclusivite d'acces a ce segment.

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