dwww Home | Manual pages | Find package

shmctl(2)                     System Calls Manual                    shmctl(2)

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 cmd, struct shmid_ds *buf);

DESCRIPTION
       shmctl()  effectue l'opération de contrôle indiquée par cmd sur le seg-
       ment 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  par-
                   tagé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 par-
       tagé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 cmd 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 parta-
              gé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 pro-
              priétaire (shm_perm.uid)  ou au créateur (shm_perm.cuid) du seg-
              ment  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 stan-
              dard)  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.  Au-
              trement,  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 sys-
              tè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 ma-
              cro _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  informa-
              tions 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 uti-
              lisateur 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 cmd :

       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  ver-
              rouillage  pour  s'assurer qu'elle est bien présente en mémoire.
              Si un segment est verrouillé, le drapeau (non standard)  SHM_LO-
              CKED  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  pro-
       prié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_MEM-
       LOCK (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 informa-
       tion peut être utilisée par des opérations SHM_STAT répétées pour obte-
       nir  les informations sur tous les segments de mémoire partagée du sys-
       tè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'es-
              pace de noms utilisateur qui gère 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 détruit.

       EINVAL shmid  n'est  pas  un  identifiant correct, ou cmd 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  ver-
              rouillés pour l'UID réel du processus appelant. Cette limite est
              la limite souple de ressource RLIMIT_MEMLOCK (consultez  setrli-
              mit(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éa-
              teur 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  er-
              reur  peut également se produire si la limite RLIMIT_MEMLOCK est
              0 et si l'appelant n'est pas privilégié.

STANDARDS
       POSIX.1-2001, POSIX.1-2008, SVr4.

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 al-
       louées. Elles peuvent être déplacées ou modifiées par la suite vers  le
       système de fichiers /proc.

       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.

       Divers champs de la structure shmid_ds étaient de type short  sous  Li-
       nux 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 cmd.)

VOIR AUSSI
       mlock(2),  setrlimit(2),  shmget(2),  shmop(2),  capabilities(7),  sys-
       vipc(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  15 décembre 2022                      shmctl(2)

Generated by dwww version 1.15 on Sat Jun 29 01:43:53 CEST 2024.