shmctl(2) System Calls Manual shmctl(2) NOM shmctl - Controler la memoire partagee System V BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include int shmctl(int shmid, int cmd, struct shmid_ds *buf); DESCRIPTION shmctl() effectue l'operation de controle indiquee par cmd sur le segment de memoire partagee System V identifie par shmid. L'argument buf est un pointeur sur une structure shmid_ds, definie dans comme suit : struct shmid_ds { struct ipc_perm shm_perm; /* Appartenance et droits */ size_t shm_segsz; /* Taille du segment (octets) */ time_t shm_atime; /* Dernier moment de rattachement */ time_t shm_dtime; /* Dernier moment de detachement */ time_t shm_ctime; /* Moment de la creation ou de la derniere modification avec shmctl() */ pid_t shm_cpid; /* PID du createur */ pid_t shm_lpid; /* PID du dernier shmat(2)/shmdt(2) */ shmatt_t shm_nattch; /* N. des attaches actuelles */ ... }; Les champs de la structure shmid_ds sont les suivants : shm_perm Il s'agit d'une structure ipc_perm (voir ci-dessous) qui indique les droits d'acces aux segments de la memoire partagee. shm_segsz Taille en octets du segment de memoire partagee. shm_atime Moment du dernier appel systeme shmat(2) qui a attache ce segment. shm_dtime Moment du dernier appel systeme shmdt(2) qui a detache ce segment. shm_ctime Moment de creation du segment ou de la derniere operation IPC_SET de shmctl(). shm_cpid PID du processus ayant cree le segment de memoire partagee. shm_lpid Identifiant du dernier processus qui a execute un appel systeme shmat(2) ou shmdt(2) sur ce segment. shm_nattch Nombre de processus qui ont ce segment attache. La structure ipc_perm est definie de la facon suivante (les champs en gras peuvent etre modifies en utilisant IPC_SET) : struct ipc_perm { key_t __key; /* Cle fournie a msgget(2) */ uid_t uid; /* UID effectif du proprietaire */ gid_t gid; /* GID effectif du proprietaire */ uid_t cuid; /* UID effectif du createur */ gid_t cgid; /* GID effectif du createur */ unsigned short mode; /* Permissions + attributs SHM_DEST et SHM_LOCKED */ unsigned short __seq; /* Numero de sequence */ }; Les 9 bits les moins significatifs du champ mode de la structure ipc_perm definissent les droits d'acces aux segments de la memoire partagee. Les bits de permission sont les suivants : 0400 Lisible par l'utilisateur 0200 Droit d'ecriture pour l'utilisateur 0040 Lisible par le groupe 0020 Autorisation d'ecriture pour le groupe 0004 Lisible par les autres 0002 Ecrit par d'autres Les bits 0100, 0010 et 0001 (bits d'execution) ne sont pas utilises par le systeme (il n'est pas necessaire d'avoir les droits d'execution sur un segment pour effectuer un appel shmat(2) avec le drapeau SHM_EXEC). Les valeurs autorisees pour cmd sont : IPC_STAT Copier dans la structure shmid_ds pointee par buf la structure de donnees du noyau concernant shmid. Le processus appelant doit avoir des privileges de lecture sur le segment de memoire partagee. IPC_SET Ecrire les valeurs de certains membres de la structure shmid_ds vers laquelle pointe buf dans la structure de donnees du noyau associee a ce segment de memoire partagee, ce qui met aussi a jour son membre shm_ctime. Les champs suivants sont mis a jour : shm_perm.uid, shm_perm.gid et (les 9 bits les moins significatifs de) shm_perm.mode. L'UID effectif du processus appelant doit correspondre au proprietaire (shm_perm.uid) ou au createur (shm_perm.cuid) du segment de memoire partagee, ou bien l'appelant doit etre privilegie. IPC_RMID Marquer un segment comme pret pour la destruction. Il sera detruit effectivement apres son dernier detachement (quand le membre shm_nattch de la structure shmid_ds associee vaudra zero). L'appelant doit etre le createur ou le proprietaire du segment, ou le superutilisateur. Le parametre buf est ignore. Si un segment est marque pour destruction, le drapeau (non standard) SHM_DEST, dans le champ shm_perm.mode de la structure de donnees associee recuperee par IPC_STAT, sera defini. L'appelant doit s'assurer que le segment sera bien detruit. Autrement, les pages qui ont ete allouees resteront indefiniment en memoire ou en swap. Consultez la description de /proc/sys/kernel/shm_rmid_forced dans proc(5). IPC_INFO (specifique a Linux) Fournir des informations sur les limites et parametres du systeme concernant la memoire partagee dans la structure pointee par buf. Cette structure est de type shminfo (ce qui necessite un transtypage), qui est defini dans si la macro _GNU_SOURCE est definie : struct shminfo { unsigned long shmmax; /* Taille maximale de segment */ unsigned long shmmin; /* Taille minimale de segment ; toujours 1 */ unsigned long shmmni; /* Nombre maximal de segments */ unsigned long shmseg; /* Nombre maximal de segments qu'un processus peut attacher ; pas utilise par le noyau */ unsigned long shmall; /* Nombre maximal de pages de memoire partagee sur le systeme */ }; Les parametres shmmni, shmmax et shmall peuvent etre modifies via les fichiers du meme nom dans /proc. Consultez proc(5) pour plus de details. SHM_INFO (specifique a Linux) Fournir une structure shm_info contenant des informations sur les ressources systeme utilisees par des segments de memoire partagee. Cette structure est definie dans si la macro _GNU_SOURCE est definie : struct shm_info { int used_ids; /* Nombre de segments actuellement existants */ unsigned long shm_tot; /* Nombre total de pages de memoire partagee */ unsigned long shm_rss; /* Nombre de pages de memoire partagee actuellement en RAM */ unsigned long shm_swp; /* Nombre de pages de memoire partagee actuellement en swap */ unsigned long swap_attempts; /* Non utilise depuis Linux 2.4 */ unsigned long swap_successes; /* Non utilise depuis Linux 2.4 */ }; SHM_STAT (specifique a Linux) Renvoyer une structure shmid_ds comme pour IPC_STAT. Cependant, l'argument shmid n'est pas l'identifiant d'un segment, mais un indice dans la table interne du noyau qui contient les informations sur tous les segments de memoire partagee du systeme. SHM_STAT_ANY (specifique a Linux, depuis Linux 4.17) Renvoyer une structure shmid_ds suite a un SHM_STAT. Neanmoins, il n'y a pas de verification de droit d'acces en lecture shm_perm.mode sur shmid, ce qui signifie que n'importe quel utilisateur peut utiliser cette operation (tout comme n'importe quel utilisateur peut lire /proc/sysvipc/shm pour obtenir les memes informations). L'appelant peut empecher ou autoriser le noyau a evincer un segment de memoire partagee en swap avec les valeurs suivantes de cmd : SHM_LOCK (specifique a Linux) Empecher le segment d'etre evince en swap. L'appelant doit consulter chaque page concernee apres avoir effectue le verrouillage pour s'assurer qu'elle est bien presente en memoire. Si un segment est verrouille, le drapeau (non standard) SHM_LOCKED sera leve dans le champ shm_perm.mode de la structure de donnees, recuperee avec IPC_STAT, associee au segment. SHM_UNLOCK (specifique a Linux) Deverrouiller le segment, ce qui autorise son swapping. Avant Linux 2.6.10, seul un processus privilegie pouvait utiliser SHM_LOCK et SHM_UNLOCK. Depuis Linux 2.6.10, un processus non privilegie peut utiliser ces operations si son UID effectif est celui du proprietaire ou du createur du segment, et (pour SHM_LOCK) la quantite de memoire a verrouiller ne depasse pas la limite de ressource RLIMIT_MEMLOCK (consultez setrlimit(2)). VALEUR RENVOYEE Une operation IPC_INFO ou SHM_INFO reussie renvoie l'index de la plus grande entree utilisee dans le tableau interne du noyau contenant les informations sur tous les segments de memoire partagee (cette information peut etre utilisee par des operations SHM_STAT repetees pour obtenir les informations sur tous les segments de memoire partagee du systeme). Une operation SHM_STAT reussie renvoie l'identifiant du segment de memoire partagee dont l'indice etait fourni par shmid. Les autres operations renvoient 0 si elles reussissent. En cas d'erreur, la valeur de retour est -1 et errno est definie pour preciser l'erreur. ERREURS EACCES L'operation demandee est IPC_STAT ou SHM_STAT, mais shm_perm.mode ne permet pas la lecture du segment shmid, et le processus appelant n'a pas la capacite CAP_IPC_OWNER dans l'espace de noms utilisateur qui gere son espace de noms IPC. EFAULT cmd a la valeur IPC_SET ou IPC_STAT mais buf pointe en dehors de l'espace d'adressage accessible. EIDRM shmid pointe sur un segment detruit. EINVAL shmid n'est pas un identifiant correct, ou cmd n'est pas une commande reconnue. Ou bien, pour l'operation SHM_STAT ou SHM_STAT_ANY, l'indice indique dans shmid correspond a un element actuellement inutilise de la table. ENOMEM (Depuis Linux 2.6.9) L'operation SHM_LOCK a ete demandee et la taille du segment a verrouiller entrainerait un depassement de la limite du nombre total d'octets de memoire partagee verrouilles pour l'UID reel du processus appelant. Cette limite est la limite souple de ressource RLIMIT_MEMLOCK (consultez setrlimit(2)). EOVERFLOW L'operation demandee est IPC_STAT mais la valeur de GID ou d'UID est trop grande pour etre stockee dans la structure pointee par buf. EPERM On reclame IPC_SET ou IPC_RMID mais l'appelant n'est ni le createur du segment (trouve dans shm_perm.cuid), ni le proprietaire (trouve dans shm_perm.uid) et le processus n'est pas privilegie (sous Linux : n'a pas la capacite CAP_SYS_ADMIN). Ou bien (avant Linux 2.6.9) soit SHM_LOCK, soit SHM_UNLOCK a ete specifie, mais le processus n'est pas privilegie (sous Linux : n'a pas la capacite CAP_IPC_LOCK. Depuis Linux 2.6.9, cette erreur peut egalement se produire si la limite RLIMIT_MEMLOCK est 0 et si l'appelant n'est pas privilegie. VERSIONS Linux autorise un processus a attacher (shmat(2)) un segment de memoire partagee ayant ete marque pour suppression avec shmctl(IPC_RMID). Cette particularite n'est pas disponible sur d'autres variantes d'UNIX ; des applications portables ne devraient pas compter sur ce comportement. STANDARDS POSIX.1-2008. HISTORIQUE POSIX.1-2001, SVr4. Divers champs de la structure shmid_ds etaient de type short sous Linux 2.2 et sont devenus des long sous Linux 2.4. Pour en tirer parti, une recompilation sous la glibc 2.1.91 ou ulterieure doit suffire. (Le noyau distingue les anciens et nouveaux appels par un drapeau IPC_64 dans cmd.) NOTES Les operations IPC_INFO, SHM_STAT et SHM_INFO sont utilisees par le programme ipcs(1) pour fournir des informations sur les ressources allouees. Elles peuvent etre deplacees ou modifiees par la suite vers le systeme de fichiers /proc. VOIR AUSSI mlock(2), setrlimit(2), shmget(2), shmop(2), capabilities(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 shmctl(2)