shmctl
Table des matières
Retour à l'index
NOM
shmctl - Contrôler la mémoire partagée System V
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#include <sys/shm.h>
int shmctl(int shmid, int op, struct shmid_ds *buf);
DESCRIPTION
shmctl() effectue l'opération de contrôle indiquée par op sur le
segment de mémoire partagée System V identifié par shmid.
L'argument buf est un pointeur sur une structure shmid_ds, définie
dans <sys/shm.h> 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 détachement */
time_t shm_ctime; /* Moment de la création ou de la dernière
modification avec shmctl() */
pid_t shm_cpid; /* PID du créateur */
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'accès aux segments de la mémoire partagée.
- shm_segsz
-
Taille en octets du segment de mémoire partagée.
- shm_atime
-
Moment du dernier appel système shmat(2) qui a attaché ce segment.
- shm_dtime
-
Moment du dernier appel système shmdt(2) qui a détaché ce segment.
- shm_ctime
-
Moment de création du segment ou de la dernière opération IPC_SET de
shmctl().
- shm_cpid
-
PID du processus ayant créé le segment de mémoire partagée.
- shm_lpid
-
Identifiant du dernier processus qui a exécuté un appel système shmat(2)
ou shmdt(2) sur ce segment.
- shm_nattch
-
Nombre de processus qui ont ce segment attaché.
La structure ipc_perm est définie de la façon suivante (les champs en
gras peuvent être modifiés en utilisant IPC_SET) :
struct ipc_perm {
key_t __key; /* Clé fournie à msgget(2) */
uid_t uid; /* UID effectif du propriétaire */
gid_t gid; /* GID effectif du propriétaire */
uid_t cuid; /* UID effectif du créateur */
gid_t cgid; /* GID effectif du créateur */
unsigned short mode; /* Permissions + attributs
SHM_DEST et SHM_LOCKED */
unsigned short __seq; /* Numéro de séquence */
};
Les 9 bits les moins significatifs du champ mode de la structure
ipc_perm définissent les droits d'accès aux segments de la mémoire
partagée. Les bits de permission sont les suivants :
| 0400 | Lisible par l'utilisateur
|
| 0200 | Droit d'écriture pour l'utilisateur
|
| 0040 | Lisible par le groupe
|
| 0020 | Autorisation d'écriture pour le groupe
|
| 0004 | Lisible par les autres
|
| 0002 | Écrit par d'autres
|
Les bits 0100, 0010 et 0001 (bits d'exécution) ne sont pas utilisés par le
système (il n'est pas nécessaire d'avoir les droits d'exécution sur un
segment pour effectuer un appel shmat(2) avec le drapeau SHM_EXEC).
Les valeurs autorisées pour op sont :
- IPC_STAT
-
Copier dans la structure shmid_ds pointée par buf la structure de
données du noyau concernant shmid. Le processus appelant doit avoir des
privilèges de lecture sur le segment de mémoire partagée.
- IPC_SET
-
Écrire les valeurs de certains membres de la structure shmid_ds vers
laquelle pointe buf dans la structure de données du noyau associée à ce
segment de mémoire partagée, ce qui met aussi à jour son membre
shm_ctime.
-
Les champs suivants sont mis à 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 propriétaire
(shm_perm.uid) ou au créateur (shm_perm.cuid) du segment de mémoire
partagée, ou bien l'appelant doit être privilégié.
- IPC_RMID
-
Marquer un segment comme prêt pour la destruction. Il sera détruit
effectivement après son dernier détachement (quand le membre shm_nattch
de la structure shmid_ds associée vaudra zéro). L'appelant doit être le
créateur ou le propriétaire du segment, ou le superutilisateur. Le paramètre
buf est ignoré.
-
Si un segment est marqué pour destruction, le drapeau (non standard)
SHM_DEST, dans le champ shm_perm.mode de la structure de données
associée récupérée par IPC_STAT, sera défini.
-
L'appelant doit s'assurer que le segment sera bien détruit. Autrement,
les pages qui ont été allouées resteront indéfiniment en mémoire ou en swap.
-
Consultez la description de /proc/sys/kernel/shm_rmid_forced dans
proc(5).
- IPC_INFO (spécifique à Linux)
-
Fournir des informations sur les limites et paramètres du système concernant
la mémoire partagée dans la structure pointée par buf. Cette structure
est de type shminfo (ce qui nécessite un transtypage), qui est défini
dans <sys/shm.h> si la macro _GNU_SOURCE est définie :
-
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 utilisé par le noyau */
unsigned long shmall; /* Nombre maximal de pages de
mémoire partagée sur le
système */
};
-
Les paramètres shmmni, shmmax et shmall peuvent être modifiés via
les fichiers du même nom dans /proc. Consultez proc(5) pour plus de
détails.
- SHM_INFO (spécifique à Linux)
-
Fournir une structure shm_info contenant des informations sur les
ressources système utilisées par des segments de mémoire partagée. Cette
structure est définie dans <sys/shm.h> si la macro _GNU_SOURCE
est définie :
-
struct shm_info {
int used_ids; /* Nombre de segments
actuellement existants */
unsigned long shm_tot; /* Nombre total de pages de
mémoire partagée */
unsigned long shm_rss; /* Nombre de pages de mémoire
partagée actuellement en RAM */
unsigned long shm_swp; /* Nombre de pages de mémoire
partagée actuellement en swap */
unsigned long swap_attempts;
/* Non utilisé depuis Linux 2.4 */
unsigned long swap_successes;
/* Non utilisé depuis Linux 2.4 */
};
- SHM_STAT (spécifique à 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 mémoire partagée du système.
- SHM_STAT_ANY (spécifique à Linux, depuis Linux 4.17)
-
Renvoyer une structure shmid_ds suite à un SHM_STAT. Néanmoins, il n'y
a pas de vérification de droit d'accès en lecture shm_perm.mode sur
shmid, ce qui signifie que n'importe quel utilisateur peut utiliser cette
opération (tout comme n'importe quel utilisateur peut lire
/proc/sysvipc/shm pour obtenir les mêmes informations).
L'appelant peut empêcher ou autoriser le noyau à évincer un segment de
mémoire partagée en swap avec les valeurs suivantes de op :
- SHM_LOCK (spécifique à Linux)
-
Empêcher le segment d'être évincé en swap. L'appelant doit consulter chaque
page concernée après avoir effectué le verrouillage pour s'assurer qu'elle
est bien présente en mémoire. Si un segment est verrouillé, le drapeau (non
standard) SHM_LOCKED sera levé dans le champ shm_perm.mode de la
structure de données, récupérée avec IPC_STAT, associée au segment.
- SHM_UNLOCK (spécifique à Linux)
-
Déverrouiller le segment, ce qui autorise son swapping.
Avant Linux 2.6.10, seul un processus privilégié pouvait utiliser
SHM_LOCK et SHM_UNLOCK. Depuis Linux 2.6.10, un processus non
privilégié peut utiliser ces opérations si son UID effectif est celui du
propriétaire ou du créateur du segment, et (pour SHM_LOCK) la quantité de
mémoire à verrouiller ne dépasse pas la limite de ressource
RLIMIT_MEMLOCK (consultez setrlimit(2)).
VALEUR RENVOYÉE
Une opération IPC_INFO ou SHM_INFO réussie renvoie l'index de la plus
grande entrée utilisée dans le tableau interne du noyau contenant les
informations sur tous les segments de mémoire partagée (cette information
peut être utilisée par des opérations SHM_STAT répétées pour obtenir les
informations sur tous les segments de mémoire partagée du système). Une
opération SHM_STAT réussie renvoie l'identifiant du segment de mémoire
partagée dont l'indice était fourni par shmid. Les autres opérations
renvoient 0 si elles réussissent.
En cas d'erreur, la valeur de retour est -1 et errno est définie pour
préciser l'erreur.
ERREURS
- EACCES
-
L'opération demandée 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 capacité CAP_IPC_OWNER dans l'espace de noms utilisateur qui gère
son espace de noms IPC.
- EFAULT
-
op 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 détruit.
- EINVAL
-
shmid n'est pas un identifiant correct, ou op n'est pas une commande
reconnue. Ou bien, pour l'opération SHM_STAT ou SHM_STAT_ANY, l'indice
indiqué dans shmid correspond à un élément actuellement inutilisé de la
table.
- ENOMEM
-
(Depuis Linux 2.6.9) L'opération SHM_LOCK a été demandée et la taille du
segment à verrouiller entraînerait un dépassement de la limite du nombre
total d'octets de mémoire partagée verrouillés pour l'UID réel du processus
appelant. Cette limite est la limite souple de ressource RLIMIT_MEMLOCK
(consultez setrlimit(2)).
- EOVERFLOW
-
L'opération demandée est IPC_STAT mais la valeur de GID ou d'UID est trop
grande pour être stockée dans la structure pointée par buf.
- EPERM
-
On réclame IPC_SET ou IPC_RMID mais l'appelant n'est ni le créateur du
segment (trouvé dans shm_perm.cuid), ni le propriétaire (trouvé dans
shm_perm.uid) et le processus n'est pas privilégié (sous Linux : n'a pas
la capacité CAP_SYS_ADMIN).
-
Ou bien (avant Linux 2.6.9) soit SHM_LOCK, soit SHM_UNLOCK a été
spécifié, mais le processus n'est pas privilégié (sous Linux : n'a pas la
capacité CAP_IPC_LOCK. Depuis Linux 2.6.9, cette erreur peut également se
produire si la limite RLIMIT_MEMLOCK est 0 et si l'appelant n'est pas
privilégié.
VERSIONS
Linux autorise un processus à attacher (shmat(2)) un segment de mémoire
partagée ayant été marqué pour suppression avec shmctl(IPC_RMID). Cette
particularité 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 étaient 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 ultérieure doit suffire. (Le noyau
distingue les anciens et nouveaux appels par un drapeau IPC_64 dans
op.)
NOTES
Les opérations IPC_INFO, SHM_STAT et SHM_INFO sont utilisées par le
programme ipcs(1) pour fournir des informations sur les ressources
allouées. Elles peuvent être déplacées ou modifiées par la suite vers le
système de fichiers /proc.
VOIR AUSSI
mlock(2), setrlimit(2), shmget(2), shmop(2), capabilities(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 à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- VERSIONS
-
- STANDARDS
-
- HISTORIQUE
-
- NOTES
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:06:05 GMT, September 19, 2025