Man page - shmget(2)

Packages contains this manual

Available languages:

en fr pl ja ru de

Manual

shmget

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
STANDARDS
HISTORIQUE
NOTES
Limites de la mémoire partagée
Notes pour Linux
BOGUES
EXEMPLES
VOIR AUSSI
TRADUCTION

NOM

shmget - Allouer un segment de mémoire partagée System V

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#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 . Il peut ĂȘtre utilisĂ© soit pour obtenir l’identifiant d’un segment de mĂ©moire partagĂ©e prĂ©cĂ©demment créé (quand shmflg vaut zĂ©ro et quand key n’a pas la valeur IPC_PRIVATE ), soit pour crĂ©er un nouvel ensemble.

Un nouveau segment mĂ©moire partagĂ©e, de taille size arrondie au multiple supĂ©rieur de PAGE_SIZE , est créé si key a la valeur IPC_PRIVATE ou si key n’est pas IPC_PRIVATE , aucun segment de mĂ©moire partagĂ©e ne correspondant Ă  key n’existe, et si IPC_CREAT est indiquĂ© 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 . Cela 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/admin-guide/mm/hugetlbpage.rst dans les sources du noyau Linux pour plus d’informations.

SHM_HUGE_2MB
SHM_HUGE_1GB
(depuis Linux 3.8)

Utilisé avec SHM_HUGETLB pour sélectionner des tailles de page hugetlb alternatives (respectivement 2 Mo et 1 Go) sur les systÚmes qui prennent en charge plusieurs tailles de page hugetlb.

Plus gĂ©nĂ©ralement, la taille de page immense dĂ©sirĂ©e peut ĂȘtre configurĂ©e en encodant le logarithme de base 2 de la taille de la page dĂ©sirĂ©e dans les six bits situĂ©s Ă  la position SHM_HUGE_SHIFT . Ainsi, les deux constantes ci-dessus sont dĂ©finies comme :

#define SHM_HUGE_2MB (21 << SHM_HUGE_SHIFT)
#define SHM_HUGE_1GB (30 << SHM_HUGE_SHIFT)

Pour plus de dĂ©tails, consultez le point sur les constantes du mĂȘme nom dans mmap (2).

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

EACCES

L’utilisateur n’a pas le droit d’accĂšs au segment de mĂ©moire partagĂ© et il n’a pas la capacitĂ© CAP_IPC_OWNER dans l’espace de noms utilisateur qui gĂšre son espace de noms IPC.

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 pour le systÚme entier 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 ) et il n’est pas membre du groupe sysctl_hugetlb_shm_group ; voir la description de /proc/sys/vm/sysctl_hugetlb_shm_group dans proc (5).

STANDARDS

POSIX.1-2008.

SHM_HUGETLB et SHM_NORESERVE sont spécifiques à Linux.

HISTORIQUE

POSIX.1-2001, SVr4.

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 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, mesurée en unités de taille de page du systÚme.

Sous Linux, cette limite peut ĂȘtre lue et modifiĂ©e grĂące au fichier /proc/sys/kernel/shmall . Depuis Linux 3.16, la valeur par dĂ©faut de cette limite est :

ULONG_MAX - 2^24

L’effet de cette valeur (qui convient aux systĂšmes 32 et 64 bits) est de n’imposer aucune limite aux allocations. Cette valeur, utilisĂ©e Ă  la place de ULONG_MAX , a Ă©tĂ© choisie par dĂ©faut pour empĂȘcher les cas oĂč les applications historiques dĂ©passaient simplement la limite sans vĂ©rifier prĂ©alablement sa valeur actuelle. De telles applications crĂ©eraient un dĂ©bordement de tampon si la limite Ă©tait fixĂ©e Ă  ULONG_MAX .

Entre Linux 2.2 et Linux 3.15, la valeur par défaut de cette limite était :

SHMMAX / PAGE_SIZE * (SHMMNI / 16)

Si SHMMAX et SHMMNI n’ont pas Ă©tĂ© modifiĂ©s, la multiplication du rĂ©sultat de cette formule par la taille de la page (pour obtenir une valeur en octets) conduirait Ă  une valeur de 8 Go comme limite de mĂ©moire totale utilisĂ©e par tous les segments de mĂ©moire partagĂ©e.

SHMMAX

Taille maximale en octets d’un segment de mĂ©moire partagĂ©e.

Sous Linux, cette limite peut ĂȘtre lue et modifiĂ©e grĂące au fichier /proc/sys/kernel/shmmax . Depuis Linux 3.16, la valeur par dĂ©faut de cette limite est :

ULONG_MAX - 2^24

L’effet de cette valeur (qui s’applique aux systĂšmes 32 et 64 bits) est de n’imposer aucune limite d’allocation. Consultez la description de SHMALL sur un point sur la raison pour laquelle cette valeur par dĂ©faut est utilisĂ©e (au lieu de ULONG_MAX ).

Entre Linux 2.2 et Linux 3.15, cette limite vaut par défaut 0x2000000 (32 Mio).

Comme il n’est pas possible de projeter une partie d’un segment de mĂ©moire partagĂ©, la quantitĂ© de mĂ©moire virtuelle pose une autre limite Ă  la taille maximum d’élĂ©vation d’un segment utilisable : par exemple, sur i389, les plus grands segments qui peuvent ĂȘtre projetĂ©s ont une taille d’environ 2.8 Go, contre environ 127 To sur un x89-64.

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 pour Linux

Jusqu’à Linux 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.

EXEMPLES

Consultez shmop (2).

VOIR AUSSI

memfd_create (2), shmat (2), shmctl (2), shmdt (2), ftok (3), capabilities (7), shm_overview (7), sysvipc (7)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Philippe MENGUAL <jpmengual@debian.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .