Man page - shmctl(2)

Packages contains this manual

Available languages:

en fr pl ja

Manual

shmctl

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
VERSIONS
STANDARDS
HISTORIQUE
NOTES
VOIR AUSSI
TRADUCTION

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 :

Image grohtml-3856545-1.png

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 à debian-l10n-french@lists.debian.org .