shmget(2) System Calls Manual shmget(2) NOM shmget - Allouer un segment de memoire partagee System V BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include int shmget(key_t key, size_t size, int shmflg); DESCRIPTION shmget() renvoie l'identifiant du segment de memoire partagee System V associe a la valeur de l'argument key. Il peut etre utilise soit pour obtenir l'identifiant d'un segment de memoire partagee precedemment cree (quand shmflg vaut zero et quand key n'a pas la valeur IPC_PRIVATE), soit pour creer un nouvel ensemble. Un nouveau segment memoire partagee, de taille size arrondie au multiple superieur de PAGE_SIZE, est cree si key a la valeur IPC_PRIVATE ou si key n'est pas IPC_PRIVATE, aucun segment de memoire partagee ne correspondant a key n'existe, et si IPC_CREAT est indique dans shmflg. Si shmflg contient a la fois les attributs IPC_CREAT et IPC_EXCL, et si un segment de memoire partagee est deja associe a key, shmget() echoue avec le code d'erreur EEXIST. Cela est similaire au comportement de open(2) avec la combinaison O_CREAT | O_EXCL. shmflg est compose de : IPC_CREAT Creer un nouveau segment. Sinon shmget() recherche le segment associe a key et verifie que l'appelant a la permission d'y acceder. IPC_EXCL Cet attribut est utilise avec IPC_CREAT pour garantir que cet appel cree le segment. Si le segment existe deja, l'appel echoue. 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) Utilise avec SHM_HUGETLB pour selectionner des tailles de page hugetlb alternatives (respectivement 2 Mo et 1 Go) sur les systemes qui prennent en charge plusieurs tailles de page hugetlb. Plus generalement, la taille de page immense desiree peut etre configuree en encodant le logarithme de base 2 de la taille de la page desiree dans les six bits situes a la position SHM_HUGE_SHIFT. Ainsi, les deux constantes ci-dessus sont definies comme : #define SHM_HUGE_2MB (21 << SHM_HUGE_SHIFT) #define SHM_HUGE_1GB (30 << SHM_HUGE_SHIFT) Pour plus de details, consultez le point sur les constantes du meme nom dans mmap(2). SHM_NORESERVE (depuis Linux 2.6.15) Cet attribut a le meme objet que l'attribut MAP_NORESERVE de mmap(2). Ne pas reserver d'espace de swap pour ce segment. Lorsque de l'espace en swap est reserve, le systeme garantit qu'il sera possible de modifier le segment. Lorsque l'espace en swap n'est pas reserve, on peut recevoir SIGSEGV lors d'une ecriture si la memoire 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 proprietaire, le groupe et les autres. Ces bits ont le meme format et la meme signification que l'argument mode de open(2). Actuellement la permission d'execution n'est pas utilisee par le systeme. Si un nouveau segment de memoire partagee est cree, le systeme initialise son contenu a zero, et la structure shmid_ds (consultez shmctl(2)) est associee 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 a 0. - shm_ctime contient l'heure actuelle. Si le segment de memoire existe deja, les permissions d'acces sont verifiees, et un controle a lieu pour voir s'il est marque pour destruction. VALEUR RENVOYEE En cas de succes, un identifiant de memoire partagee valide est renvoye. En cas d'erreur, -1 est renvoye et errno contient le code d'erreur. ERREURS EACCES L'utilisateur n'a pas le droit d'acces au segment de memoire partage et il n'a pas la capacite CAP_IPC_OWNER dans l'espace de noms utilisateur qui gere son espace de noms IPC. EEXIST IPC_CREAT et IPC_EXCL etaient indiques dans shmflg, mais un segment de memoire partage associe a key existe deja. EINVAL Un nouveau segment devait etre cree et size est inferieur a SHMMIN ou superieur a SHMMAX. EINVAL Un segment associe a key existe, mais sa taille est inferieure a size. ENFILE La limite du nombre total de fichiers ouverts pour le systeme entier a ete atteinte. ENOENT Aucun segment n'est associe a key, et IPC_CREAT n'etait pas indique. ENOMEM Pas assez de memoire pour allouer le segment. ENOSPC Tous les identifiants de memoire partagee sont utilises (SHMMNI), ou l'allocation d'un segment partage de taille size depasserait les limites de memoire partagee du systeme (SHMALL). EPERM L'attribut SHM_HUGETLB est indique, mais l'appelant n'est pas privilegie (ne possede pas la capacite 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 specifiques a Linux. HISTORIQUE POSIX.1-2001, SVr4. NOTES IPC_PRIVATE n'est pas une option mais une valeur de type key_t. Si cette valeur speciale est utilisee comme cle, l'appel systeme ignore tout sauf les 9 bits de poids faible de shmflg et tente de creer un nouveau segment. Limites de la memoire partagee Les limites suivantes influent sur l'appel systeme shmget : SHMALL Limite systeme du nombre de pages de memoire partagee, mesuree en unites de taille de page du systeme. Sous Linux, cette limite peut etre lue et modifiee grace au fichier /proc/sys/kernel/shmall. Depuis Linux 3.16, la valeur par defaut de cette limite est : ULONG_MAX - 2^24 L'effet de cette valeur (qui convient aux systemes 32 et 64 bits) est de n'imposer aucune limite aux allocations. Cette valeur, utilisee a la place de ULONG_MAX, a ete choisie par defaut pour empecher les cas ou les applications historiques depassaient simplement la limite sans verifier prealablement sa valeur actuelle. De telles applications creeraient un debordement de tampon si la limite etait fixee a ULONG_MAX. Entre Linux 2.2 et Linux 3.15, la valeur par defaut de cette limite etait : SHMMAX / PAGE_SIZE * (SHMMNI / 16) Si SHMMAX et SHMMNI n'ont pas ete modifies, la multiplication du resultat de cette formule par la taille de la page (pour obtenir une valeur en octets) conduirait a une valeur de 8 Go comme limite de memoire totale utilisee par tous les segments de memoire partagee. SHMMAX Taille maximale en octets d'un segment de memoire partagee. Sous Linux, cette limite peut etre lue et modifiee grace au fichier /proc/sys/kernel/shmmax. Depuis Linux 3.16, la valeur par defaut de cette limite est : ULONG_MAX - 2^24 L'effet de cette valeur (qui s'applique aux systemes 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 defaut est utilisee (au lieu de ULONG_MAX). Entre Linux 2.2 et Linux 3.15, cette limite vaut par defaut 0x2000000 (32 Mio). Comme il n'est pas possible de projeter une partie d'un segment de memoire partage, la quantite de memoire virtuelle pose une autre limite a la taille maximum d'elevation d'un segment utilisable : par exemple, sur i389, les plus grands segments qui peuvent etre projetes ont une taille d'environ 2.8 Go, contre environ 127 To sur un x89-64. SHMMIN Taille minimale, en octets, d'un segment partage : depend de l'implementation (actuellement 1 octet, bien que PAGE_SIZE soit la valeur effectivement utilisee). SHMMNI Limite systeme du nombre de segments de memoire partagee. Avec Linux 2.2, cette limite valait 128 par defaut. Depuis Linux 2.4, cette valeur par defaut vaut 4096. Sous Linux, cette limite peut etre lue et modifiee grace au fichier /proc/sys/kernel/shmmni). L'implementation n'a pas de limite specifique pour le nombre maximal de segments partages par processus (SHMSEG). Notes pour Linux Jusqu'a Linux 2.3.30, Linux renvoyait l'erreur EIDRM pour un shmget() sur un segment de memoire marque pour destruction. BOGUES Le choix du nom IPC_PRIVATE est malheureux, IPC_NEW aurait mieux decrit 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 francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 shmget(2)