shmget(2) System Calls Manual shmget(2) 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_PRI- VATE), soit pour créer un nouvel ensemble. Un nouveau segment mémoire partagée, de taille size arrondie au mul- tiple 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 ac- cé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 sys- tè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éfi- nies 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'ar- gument 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 initia- lise 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'appe- lant. • shm_perm.cgid et shm_perm.gid contiennent le GID effectif de l'appe- lant. • 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 destruc- tion. VALEUR RENVOYÉE En cas de succès, un identifiant de mémoire partagée valide est ren- voyé. En cas d'erreur, -1 est renvoyé et errno contient le code d'er- reur. 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 seg- ment de mémoire partagé associé à key existe déjà. EINVAL Un nouveau segment devait être créé et size est inférieur à SHM- MIN 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 in- diqué. 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 descrip- tion de /proc/sys/vm/sysctl_hugetlb_shm_group dans proc(5). STANDARDS POSIX.1-2001, POSIX.1-2008, SVr4. SHM_HUGETLB et SHM_NORESERVE sont spécifiques à 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 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 fi- chier /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 va- leur, utilisée à la place de ULONG_MAX, a été choisie par défaut pour empêcher les cas où les applications historiques dépas- saient simplement la limite sans vérifier préalablement sa va- leur 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 li- mite é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 li- mite 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 fi- chier /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 utili- sable : 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 fi- chier /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), capabili- ties(7), shm_overview(7), sysvipc(7) TRADUCTION La traduction française de cette page de manuel a été créée par Chris- tophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <ste- phan.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.cou- lon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centra- liens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <si- mon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@de- bian.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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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⟩. Pages du manuel de Linux 6.03 10 février 2023 shmget(2)
Generated by dwww version 1.15 on Sat Jun 29 01:43:15 CEST 2024.