Provided by: manpages-fr-dev_4.19.0-7_all bug

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 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 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 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 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 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 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 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é.

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 alloué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  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 cmd.)

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  ⟨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⟩.