SHMGET
Section : Manuel du programmeur Linux (
2)
Mise à jour de la version anglaise : 2 mai 2006
Index
Menu principal
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.
Index
- NOM
-
- SYNOPSIS
-
- DESCRIPTION
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- CONFORMITÉ
-
- NOTES
-
- Notes Linux
-
- BOGUES
-
- VOIR AUSSI
-
- TRADUCTION
-
Dernière mise à jour : 4 juillet 2008