Provided by: manpages-fr-dev_3.27fr1.4-1_all bug

NOM

       semop, semtimedop - Operations sur les semaphores

SYNOPSIS

       #include <sys/types.h>
       #include <sys/ipc.h>
       #include <sys/sem.h>

       int semop(int semid, struct sembuf *sops, unsigned nsops);

       int semtimedop(int semid, struct sembuf *sops, unsigned nsops,
                      struct timespec *timeout);

   Exigences  de  macros  de  test de fonctionnalites pour la glibc (consultez
   feature_test_macros(7)) :

       semtimedop() : _GNU_SOURCE

DESCRIPTION

       Chaque semaphore dans un ensemble de semaphores se  voit  associer  les
       valeurs suivantes :

           unsigned short  semval;   /* valeur du semaphore   */
           unsigned short  semzcnt;  /* # Attente pour zero   */
           unsigned short  semncnt;  /* # Attente d'increment */
           pid_t           sempid;   /* dernier processus agissant */

       La  fonction  semop()  effectue  des  operations  sur  les  membres  de
       l'ensemble de semaphores identifie par semid. Chacun des nsops elements
       dans  le  tableau pointe par sops indique une operation a effectuer sur
       un semaphore en utilisant une structure  struct  sembuf  contenant  les
       membres suivants :

           unsigned short sem_num;  /* Numero du semaphore        */
           short          sem_op;   /* Operation sur le semaphore */
           short          sem_flg;  /* Options pour l'operation   */

       Les  options possibles pour sem_flg sont IPC_NOWAIT et SEM_UNDO. Si une
       operation indique l'option  SEM_UNDO,  elle  sera  annulee  lorsque  le
       processus se terminera.

       L'ensemble des operations contenues dans sops est effectue dans l'ordre
       et atomiquement. Les operations sont toutes realisees en meme temps, et
       seulement  si  elle  peuvent toutes etre effectuees. Le comportement de
       l'appel systeme si toutes les operations ne sont pas realisables depend
       de la presence de l'attribut IPC_NOWAIT dans les champs sem_flg decrits
       plus bas.

       Chaque  operation  est  effectuee  sur  le  sem_num-ieme  semaphore  de
       l'ensemble.   Le  premier  semaphore  est  le  numero  0.  Pour  chaque
       semaphore, l'operation est l'une des trois decrites ci-dessous.

       Si l'argument sem_op est un entier positif, la  fonction  ajoute  cette
       valeur a semval. De plus si SEM_UNDO est demande, le systeme met a jour
       le compteur << undo >> du semaphore  (semadj).  Cette  operation  n'est
       jamais  bloquante.  Le  processus appelant doit avoir l'autorisation de
       modification sur le jeu de semaphores.

       Si sem_op vaut zero le processus doit avoir l'autorisation  de  lecture
       sur l'ensemble de semaphores. Le processus attend que semval soit nul :
       si semval vaut zero, l'appel systeme continue immediatement. Sinon,  si
       l'on  a reclame IPC_NOWAIT dans sem_flg, l'appel systeme semop() echoue
       et errno contient le code d'erreur EAGAIN (et aucune des operations  de
       sops  n'est  realisee).  Autrement  semzcnt  est  incremente de 1 et le
       processus s'endort jusqu'a ce  que  l'un  des  evenements  suivants  se
       produise :

       o  semval devient egal a 0, alors semzcnt est decremente.

       o  Le  jeu  de semaphores est supprime. L'appel systeme echoue et errno
          contient le code d'erreur EIDRM.

       o  Le processus recoit un signal a intercepter, la  valeur  de  semzcnt
          est  decrementee  et  l'appel systeme echoue avec errno contenant le
          code d'erreur EINTR.

       o  La limite temporelle indique par  timeout  dans  un  semtimedop()  a
          expire : l'appel systeme echoue avec errno contenant EAGAIN.

       Si  sem_op  est  inferieur  a  zero,  le  processus appelant doit avoir
       l'autorisation de modification sur le jeu de semaphores. Si semval  est
       superieur  ou  egal a la valeur absolue de sem_op, la valeur absolue de
       sem_op est soustraite de semval, et si SEM_UNDO est indique, le systeme
       met  a  jour le compteur << undo >> du semaphore (semadj). Puis l'appel
       systeme continue. Si la valeur absolue de sem_op est  plus  grande  que
       semval,  et  si l'on a reclame IPC_NOWAIT dans sem_flg, l'appel systeme
       echoue et errno  contient  le  code  d'erreur  EAGAIN  (et  aucune  des
       operations  de sops n'est realisee). Sinon semncnt est incremente de un
       et le processus s'endort jusqu'a ce que l'un des evenements suivants se
       produise :

       o  semval  devient  superieur  ou  egal  a la valeur absolue de sem_op,
          alors la valeur semncnt est decrementee, la valeur absolue de sem_op
          est soustraite de semval et si SEM_UNDO est demande le systeme met a
          jour le compteur << undo >> (semadj) du semaphore.

       o  Le jeu de semaphores est supprime. L'appel systeme echoue  et  errno
          contient le code d'erreur EIDRM.

       o  Le  processus  recoit  un signal a intercepter, la valeur de semncnt
          est decrementee et l'appel systeme echoue avec  errno  contenant  le
          code d'erreur EINTR.

       o  La  limite  temporelle  indique  par  timeout dans un semtimedop() a
          expire : l'appel systeme echoue avec errno contenant EAGAIN.

       En cas de succes, le membre sempid de chacun  des  semaphores  indiques
       dans  le  tableau  pointe  par sops est rempli avec le PID du processus
       appelant. Enfin sem_otime est fixe a l'heure actuelle.

       La fonction semtimedop() se comporte comme semop() sauf que dans le cas
       ou  le  processus doit dormir, la duree maximale du sommeil est limitee
       par la valeur specifiee dans la structure timespec dont  l'adresse  est
       transmise  dans  le  parametre  timeout.  Si  la  limite indiquee a ete
       atteinte, l'appel systeme echoue avec errno contenant EAGAIN (et aucune
       operation  de  sops  n'est realisee). Si le parametre timeout est NULL,
       alors semtimedop() se comporte exactement comme semop().

VALEUR RENVOY'EE

       En cas de reussite, semop() et  semtimedop()  renvoient  0.  Sinon  ils
       renvoient -1 et errno contient le code d'erreur.

ERREURS

       En cas d'erreur, errno prend l'une des valeurs suivantes :

       E2BIG  l'argument  nsops  est  superieur  a  SEMOPM,  le nombre maximal
              d'operations par appel systeme.

       EACCES Le processus appelant n'a pas les permissions  necessaires  pour
              effectuer les operations sur les semaphores specifies et n'a pas
              la capacite CAP_IPC_OWNER.

       EAGAIN Une operation ne pouvait pas  etre  effectuee  immediatement  et
              IPC_NOWAIT  a  ete  indique dans l'argument sem_flg, ou la duree
              limite indiquee dans timeout a expire.

       EFAULT sops ou timeout  pointent  en  dehors  de  l'espace  d'adressage
              accessible.

       EFBIG  La  valeur  de sem_num est inferieure a 0 ou superieure ou egale
              au nombre de semaphores dans l'ensemble.

       EIDRM  Le jeu de semaphores a ete supprime.

       EINTR  Un signal a ete recu pendant l'attente ; consultez signal(7).

       EINVAL L'ensemble de semaphores n'existe pas ou semid est  inferieur  a
              zero, ou nsops n'est pas strictement positive.

       ENOMEM L'argument  sem_flg  de certaines operations demande SEM_UNDO et
              le systeme n'a pas assez de memoire pour allouer les  structures
              necessaires.

       ERANGE sem_op+semval  est  superieur  a  SEMVMX  (la valeur maximale de
              semval  autorisee   par   l'implementation)   pour   l'une   des
              operations.

VERSIONS

       semtimedop() est apparu pour la premiere fois dans Linux 2.5.52, puis a
       ete retroporte au noyau 2.4.22. La  gestion  de  semtimedop()  dans  la
       glibc date de la version 2.3.3.

CONFORMIT'E

       SVr4, POSIX.1-2001.

NOTES

       Les  structures  sem_undo  d'un  processus ne sont pas heritees par ses
       enfants lors d'un fork(2), mais elles le sont lors d'un  appel  systeme
       execve(2).

       semop() n'est jamais relance automatiquement apres avoir ete interrompu
       par un gestionnaire de signal quelque soit l'attribut SA_RESTART durant
       l'installation du gestionnaire.

       semadj  est  un  entier  pour le processus qui represente simplement le
       compte  (negatif)  des  operations  sur  le  semaphore  realisees   par
       l'attribut   SEM_UNDO.   Quand  la  valeur  d'un  semaphore  est  fixee
       directement par une requete SETVAL ou SETALL de  semctl(2),  la  valeur
       semadj correspondante est effacee dans tous les processus.

       Les  valeurs  semval,  sempid,  semzcnt,  et  semnct  pour un semaphore
       peuvent etre retrouvees avec des appels semctl(2) specifiques.

       Les limites systeme suivantes concernent semop() :

       SEMOPM Nombre maximal d'operations pour une appel a semop() (32).  Sous
              Linux,  cette  limite peut etre lue et modifiee via le troisieme
              champ du fichier /proc/sys/kernel/sem.

       SEMVMX Valeur maximale pour  semval :  dependante  de  l'implementation
              (32767).

       L'implementation  n'a  pas  de  limites  intrinseques  pour  la  valeur
       maximale d'effacement en  sortie  (SEMAEM),  le  nombre  de  structures
       d'annulation   sur  le  systeme  (SEMMNU),  et  le  nombre  maximal  de
       structures d'annulation pour un processus.

BOGUES

       Quand un processus se termine, l'ensemble des structures semadj qui lui
       sont  associees  servent  a annuler les effets de toutes les operations
       sur les semaphores realisees avec l'attribut  SEM_UNDO.  Ceci  pose  un
       probleme : si l'une (ou plusieurs) des modifications sur les semaphores
       demande une descente du compteur d'un semaphore au-dessous de zero, que
       doit  faire l'implementation ? Une approche possible consiste a bloquer
       jusqu'a ce que  la  modification  du  semaphore  soit  possible.  C'est
       neanmoins  peu  desirable  car  la  terminaison du processus peut alors
       bloquer  pendant  une  periode   arbitrairement   longue.   Une   autre
       possibilite  est d'ignorer la modification du semaphore (comme un echec
       lorsque IPC_NOWAIT est specifie durant une operation). Linux adopte une
       troisieme  approche :  decroitre  la  valeur  du  semaphore  autant que
       possible (jusqu'a zero)  et  permettre  au  processus  de  se  terminer
       immediatement.

       Dans  les  noyaux  2.6.x  (x  <=  10)  un  bogue  peut,  dans certaines
       circonstances, empecher un  processus  attendant  que  la  valeur  d'un
       semaphore  s'annule  d'etre  reveille  quand cette valeur atteint 0. Ce
       bogue est corrige dans le noyau 2.6.11.

EXEMPLE

       Le bout de code suivant utilise semop() pour attendre de facon atomique
       que  la valeur du semaphore 0 vaille zero, puis incremente la valeur du
       semaphore de un.

           struct sembuf sops[2];
           int semid;

           /* Le code pour configurer semid est omis */

           sops[0].sem_num = 0;        /* Agir sur le semaphore 0 */
           sops[0].sem_op = 0;         /* Attendre que la valeur soit egal a 0 */
           sops[0].sem_flg = 0;

           sops[1].sem_num = 0;        /* Agir sur le semaphore 0 */
           sops[1].sem_op = 1;         /* Incrementer la valeur de un */
           sops[1].sem_flg = 0;

           if (semop(semid, sops, 2) == -1) {
               perror("semop");
               exit(EXIT_FAILURE);
           }

VOIR AUSSI

       semctl(2), semget(2), sigaction(2),  capabilities(7),  sem_overview(7),
       svipc(7), time(7)

COLOPHON

       Cette  page  fait  partie  de  la  publication 3.27 du projet man-pages
       Linux. Une description du projet et des instructions pour signaler  des
       anomalies       peuvent       etre       trouvees      a      l'adresse
       <URL:http://www.kernel.org/doc/man-pages/>.

TRADUCTION

       Depuis 2010, cette traduction est maintenue a l'aide  de  l'outil  po4a
       <URL:http://po4a.alioth.debian.org/>   par   l'equipe   de   traduction
       francophone       au       sein        du        projet        perkamon
       <URL:http://perkamon.alioth.debian.org/>.

       Christophe  Blaess  <URL:http://www.blaess.fr/christophe/> (1996-2003),
       Alain  Portal  <URL:http://manpagesfr.free.fr/>  (2003-2006).    Julien
       Cristau et l'equipe francophone de traduction de Debian (2006-2009).

       Veuillez   signaler   toute   erreur   de   traduction  en  ecrivant  a
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

       Vous  pouvez  toujours avoir acces a la version anglaise de ce document
       en utilisant la commande << man -L C <section> <page_de_man> >>.