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é, size_t size, int shmflg);

DESCRIPTION
shmget() renvoie l'identifiant du segment de mémoire partagée associé à la valeur de l'argument clé. Un nouveau 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.

Si shmflg contient à la fois les attributs IPC_CREAT et IPC_EXCL et qu'un segment de mémoire partagée existe déjà pour key, alors shmget() échouera et errno contiendra le code d'erreur EEXIST. (Ceci est analogue à l'effet de la combinaison O_CREAT | O_EXCL pour open(2).)

shmflg est composé de :

IPC_CREAT
    pour créer un nouveau segment. Sinon shmget() recherchera le segment associé à clé, vérifiera que l'appelant a la permission d'y accéder.

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 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 (Ndt : huge pages). Voir le fichier Documentation/vm/hugetlbpage.txt dans la documentation des sources du noyau pour plus d'informations.

SHM_NORESERVE (depuis Linux 2.6.15)
    Cet attribut sert à la même chose que l'attribut MAP_NORESERVE de mmap(2). Ne pas réserver d'espace de swap pour ce segment. Une telle réservation garantit qu'il sera possible de modifier le segment. Sans réservation, on peut recevoir un signal SIGSEGV durant une écriture, s'il n'y a plus de mémoire physique disponible. Voir également la discussion sur le fichier /proc/sys/vm/overcommit_memory dans proc(5).

Lorsqu'un nouveau segment de mémoire partagée est créé, son contenu est initialisé avec des valeurs nulles, et sa structure de données associée shmid_ds (voir shmctl(2)) est initialisée de la manière suivante :

    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 les 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
    On a indiqué IPC_CREAT | IPC_EXCL et le segment existe déjà.

EINVAL
    Un nouveau segment devait être créé et size < SHMMIN ou size > SHMMAX, ou bien aucun nouveau segment ne devait être créé, il en existe un associé à clé mais sa taille est inférieure à size plus grand que la taille du segment.

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

ENOENT
    Aucun segment n'est associé à clé,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 était 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 une extension Linux qui n'est pas portable.

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 via /proc/sys/kernel/shmall).

SHMMAX
    Taille maximale d'un segment partagé : dépendante de la politique (sous Linux, cette limite peut être lue et modifiée via /proc/sys/kernel/shmmax).

SHMMIN
    Taille minimale d'un segment partagé : dépendante 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 : dépendante de l'implémentation (actuellement 4096, mais 128 avant Linux 2.3.99 ; sous Linux, cette limite peut être lue et modifiée via /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 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 plutôt malheureux, IPC_NEW aurait mieux décrit sa fonction.
 il aurait mieux valu utiliser

VOIR AUSSI
shmat(2), shmctl(2), shmdt(2), ftok(3), capabilities(7), shm_overview(7), svipc(7)

TRADUCTION

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 16 octobre 1996 et révisée le 4 juillet 2008.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 shmget ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.