SHMGET(2)

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
    Cet attribut est utilisé avec IPC_CREAT pour garantir que cet appel créé le segment. Si le segment existe déjà, l'appel échoue.

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

En plus des attributs ci-dessus, les 9 bits de poids faible de shmflg indiquent 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.

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 faible de shm_perm.mode contiennent les 9 bits de poids faible 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
    IPC_CREAT et IPC_EXCL étaient indiqués dans shmflg, mais un segment de mémoire partagé associé à key existe déjà.

EINVAL
    Un nouveau segment devait être créé et size est inférieur à SHMMIN ou supérieur à SHMMAX.

EINVAL
    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 et SHM_NORESERVE sont spécifiques à 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 faible de shmflg et tente de créer un nouveau segment.

  Limites de la mémoire partagée
Les limites suivantes influent sur l'appel système shmget :

SHMALL
    Limite système du nombre de pages de mémoire partagée. Depuis Linux 2.4, cette limite vaut par défaut :
        SHMMAX / PAGE_SIZE * (SHMMNI / 16) Avec les valeurs par défaut de SHMMAX et SHMMNI, cette formule résulte en une limite de 8 GB sur la quantité totale de mémoire utilisée par tous les segments de mémoire partagée ; 2^21 (2 097 152) pour une page de 4 kB ; 2^20 (1 048 576) pour une page de 8 kB. 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
    Limite système du nombre de segments de mémoire partagée. 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.70 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 à <perkamon-fr@traduc.org>.

Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « LC_ALL=C man <section> <page_de_man> ».