NOM
shmget - Allouer un segment de mémoire partagée
SYNOPSIS
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
shmget() renvoie l’identifiant du segment de mémoire partagée 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 Utilisé avec IPC_CREAT pour garantir l’échec si le segment
existe déjà.
mode daccs
(les 9 bits de poids faibles) 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. Voir le
fichier Documentation/vm/hugetlbpage.txt dans les sources
du noyau 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. Voir aussi la discussion du fichier
/proc/sys/vm/overcommit_memory dans proc(5).
Si un nouveau segment de mémoire partagée est créé, le système
initialise son contenu à zéro, et la structure shmid_ds (voir
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 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 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 shmflg contient IPC_CREAT | IPC_EXCL mais le segment existe
déjà.
EINVAL Un nouveau segment devait être créé et size < SHMMIN ou size >
SHMMAX, ou bien 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 est spécifique à Linux.
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 grâce au fichier
/proc/sys/kernel/shmall).
SHMMAX Taille maximale, en octets, d’un segment partagé (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 Nombre maximal de segments de mémoire partagée sur le système
(actuellement 4096, mais 128 avant Linux 2.3.99 ; 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.23 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
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».