Provided by: manpages-fr-dev_2.45.1-1_all bug
 

NOM

        shmctl - Contrôler la mémoire partagée
 

SYNOPSIS

        #include <sys/ipc.h> #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 segment
        de mémoire partagée 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;   /* Propriétaire et permissions    */
              int             shm_segsz;  /* Taille segment en octets       */
              time_t          shm_atime;  /* Heure dernier attachement      */
              time_t          shm_dtime;  /* Heure dernier détachement      */
              time_t          shm_ctime;  /* Heure dernier changement       */
              unsigned short  shm_cpid;   /* PID du créateur                */
              unsigned short  shm_lpid;   /* PID du dernier shmat()/shmdt() */
              short           shm_nattch; /* Nombre d’attachements          */
            };
 
        La structure ipc_perm est définie dans <sys/ipc.h> 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() */
                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 valeurs autorisées pour l’opération cmd sont :
 
        IPC_STAT    copier dans la structure shmid_ds pointée par buf la struc‐
                    ture  de  données  du  noyau concernant shmid. Le processus
                    appelant doit avoir des privilèges de lecture sur le jeu de
                    sémaphores
 
        IPC_SET     Écrire  la  valeur  de  certains  champs  de  la  structure
                    shmid_ds  pointée  par  buf  dans  la  structure  du  noyau
                    représentant  ce  segment de mémoire partagée, en mettant à
                    jour le champ shm_ctime. Les champs suivants  peuvent  être
                    mis  à  jour :  shm_perm.uid, shm_perm.gid et les 9 bits de
                    poids faibles de shm_perm.mode. L’UID effectif du processus
                    appelant    doit    être   soit   celui   du   propriétaire
                    (shm_perm.uid) soit celui du  créateur  (shm_perm.cuid)  du
                    segment partagé, 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 le dernier  détachement  (quand
                    le membre shm_nattch de la structure shmid_ds associée vau‐
                    dra zéro). L’appelant doit être le créateur du segment, son
                    propriétaire,  ou  le  superutilisateur.  Si un segment est
                    marqué pour destruction, le drapeau (non standard) SHM_DEST
                    sera  levé  dans  le champ shm_perm.mode de la structure de
                    données associée récupérée par IPC_STAT.
 
        Il est à la charge du processus utilisateur de s’assurer que le segment
        sera  bien détruit. Autrement, il restera indéfiniment en mémoire ou en
        swap.
 
        IPC_INFO (spécifique à Linux)
               Renvoie 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 max. d’un segment */
                     unsigned long shmmin; /* Taille min d’un segment ; toujours 1 */
                     unsigned long shmmni; /* Nb. max de segments */
                     unsigned long shmseg; /* Nb. max de segments qu’un
                                              processus peut attacher ; inutilisé */
                     unsigned long shmall; /* Nb. max 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. Voir proc(5) pour plus
               de détails.
 
        SHM_INFO (spécifique à Linux)
               Renvoie 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;           /* Nb de segments existant
                                                actuellement */
                     unsigned long shm_tot;  /* Nb total de pages de
                                                mémoire partagée */
                     unsigned long shm_rss;  /* Nb de pages de mémoire partagée
                                                actuellement en RAM */
                     unsigned long shm_swp;  /* Nb 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)
               Renvoie  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 des informa‐
               tions sur tous les segments de mémoire partagée du système.
 
        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 réautorise le swapping.
 
        Dans  les noyaux antérieurs à 2.6.10, seul un processus privilégié pou‐
        vait 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 verrouillée est prise en compte pour la limite de
        ressource RLIMIT_MEMLOCK (voir setrlimit(2)).
        Une opération IPC_INFO ou SHM_INFO réussie renvoie le plus grand indice
        d’un élément utilisé dans la table interne du noyau concernant les seg‐
        ments de mémoire partagée. Cette information peut être utilisée par des
        opérations SHM_STAT répétées pour obtenir des informations sur tous les
        segments de mémoire partagée sur le  système.  Une  opération  SHM_STAT
        réussie renvoie l’identifiant du segment dont l’indice était donné dans
        shmid. Toutes les autres opérations renvoient 0 en cas de réussite.
 
        En cas d’erreur, la valeur de retour est -1, et errno contient le  code
        d’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.
 
        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 valide, ou cmd n’est pas  une
                   commande   valide.   Ou  bien,  pour  l’opération  SHM_STAT,
                   l’indice  indiqué  dans  shmid  correspond  à   un   élément
                   actuellement inutilisé de la table.
 
        ENOMEM     (Depuis le noyau 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_MEM     
                   LOCK (voir 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 pro‐
                   prié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 (pour les noyaux antérieurs à 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 l’appelant  n’est  pas
                   privilégié.
 

NOTES

        Les  opérations  IPC_INFO,  SHM_STAT  et SHM_INFO sont utilisées par le
        programme ipcs(8) pour fournir  des  informations  sur  les  ressources
        allouées.  Ceci  peut changer dans le futur, en utilisant une interface
        sur le système de fichiers /proc.
 
        Linux autorise un processus à attacher (shmat()) 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 des  shorts  sous  Linux
        2.2  et  sont  devenus  longs  sous Linux 2.4. Pour en tirer parti, une
        recompilation sous glibc 2.1.91 ou ultérieure doit suffire.  (Le  noyau
        distingue  les  anciens  et  nouveaux appels par un drapeau IPC_64 dans
        cmd.)
 

CONFORMIT

        SVr4, POSIX.1-2001.
        mlock(2), setrlimit(2), shmget(2), shmop(2), capabilities(7)
 

TRADUCTION

        Cette page de manuel a été traduite  et  mise  à  jour  par  Christophe
        Blaess  <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
        Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et  mise  à
        disposition sur http://manpagesfr.free.fr/.
 
        Les mises à jour et corrections de la version présente dans Debian sont
        directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
        francophone de traduction de Debian.
 
        Veuillez   signaler   toute   erreur   de   traduction  en  écrivant  à
        <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
        paquet manpages-fr.
 
        Vous  pouvez  toujours avoir accès à la version anglaise de ce document
        en utilisant la commande « man -L C <section> <page_de_man> ».