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 );
DESCRIPTION¶
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 d'accès
- (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.
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).
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 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).
SVr4, POSIX.1-2001.
SHM_HUGETLB est spécifique à 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 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.44 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 à
<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> ».