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
- 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¶
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
- 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. Depuis Linux 2.2, cette limite vaut par
défaut :
SHMMAX / PAGE_SIZE * (SHMMNI / 16)
Pour une page de mémoire de 4 ko, cette formule produit
(depuis Linux 2.4) la valeur 2^20 (2 097 152).
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
- Nombre maximal de segments de mémoire partagée sur le
système. 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.65 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> ».