Provided by: manpages-fr-dev_3.65d1p1-1_all bug

NOM

       semop, semtimedop - Opérations sur les sémaphores System V

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   fonctionnalités   pour   la   glibc   (consultez
   feature_test_macros(7)) :

       semtimedop() : _GNU_SOURCE

DESCRIPTION

       Chaque sémaphore dans un ensemble de sémaphores System V  se  voit  associer  les  valeurs
       suivantes :

           unsigned short  semval;   /* valeur du sémaphore   */
           unsigned short  semzcnt;  /* # Attente pour zéro   */
           unsigned short  semncnt;  /* # Attente d'incrément */
           pid_t           sempid;   /* PID du dernier processus agissant */

       La  fonction  semop()  effectue des opérations sur les membres de l'ensemble de sémaphores
       identifié par semid. Chacun des nsops éléments dans le tableau pointé par sops indique une
       opération  à effectuer sur un sémaphore en utilisant une structure struct sembuf contenant
       les membres suivants :

           unsigned short sem_num;  /* Numéro du sémaphore        */
           short          sem_op;   /* Opération sur le sémaphore */
           short          sem_flg;  /* Options pour l'opération   */

       Les options possibles pour sem_flg sont IPC_NOWAIT et SEM_UNDO. Si une  opération  indique
       l'option SEM_UNDO, elle sera annulée lorsque le processus se terminera.

       L'ensemble  des  opérations contenues dans sops est effectué dans l'ordre et atomiquement.
       Les opérations sont toutes réalisées en même temps, et seulement si elles  peuvent  toutes
       être  effectuées.  Le comportement de l'appel système si toutes les opérations ne sont pas
       réalisables dépend de la présence de l'attribut IPC_NOWAIT dans les champs sem_flg décrits
       plus bas.

       Chaque  opération  est  effectuée  sur le sem_num-ième sémaphore de l'ensemble. Le premier
       sémaphore est le numéro 0. Pour chaque sémaphore, l'opération est l'une des trois décrites
       ci-dessous.

       Si  l'argument  sem_op est un entier positif, la fonction ajoute cette valeur à semval. De
       plus si SEM_UNDO est demandé, le système soustrait la valeur sem_op à la valeur de mise  à
       jour  de sémaphore (semadj). Cette opération n'est jamais bloquante. Le processus appelant
       doit avoir l'autorisation de modification sur le jeu de sémaphores.

       Si sem_op vaut zéro le processus doit avoir l'autorisation de lecture  sur  l'ensemble  de
       sémaphores. Le processus attend que semval soit nul : si semval vaut zéro, l'appel système
       continue immédiatement. Sinon, si l'on a réclamé IPC_NOWAIT dans sem_flg, l'appel  système
       semop() échoue et errno contient le code d'erreur EAGAIN (et aucune des opérations de sops
       n'est réalisée). Sinon semzcnt (le décompte de threads en attente  jusqu'à  ce  que  cette
       valeur  de  sémaphore  devienne zéro) est incrémenté d'un et le thread s'endort jusqu'à ce
       que l'un des événements suivants se produise :

       •  semval devient égal à 0, alors semzcnt est décrémenté.

       •  Le jeu de sémaphores est supprimé. L'appel système échoue et  errno  contient  le  code
          d'erreur EIDRM.

       •  Le  thread  reçoit  un  signal  à  intercepter, la valeur de semzcnt est décrémentée et
          l'appel système échoue avec errno contenant le code d'erreur EINTR.

       •  La limite temporelle indiqué par  timeout  dans  un  semtimedop()  a  expiré :  l'appel
          système échoue avec errno contenant EAGAIN.

       Si  sem_op  est  inférieur  à  zéro,  le  processus  appelant doit avoir l'autorisation de
       modification sur le jeu de sémaphores. Si semval est supérieur ou égal à la valeur absolue
       de  sem_op,  la  valeur  absolue  de  sem_op  est soustraite de semval, et si SEM_UNDO est
       indiqué, le système ajoute la valeur absolue de sem_op à la  valeur  de  mise  à  jour  de
       sémaphore  (semadj)  pour ce sémaphore. Si la valeur absolue de sem_op est plus grande que
       semval, et si l'on a réclamé IPC_NOWAIT dans sem_flg,  l'appel  système  échoue  et  errno
       contient  le code d'erreur EAGAIN (et aucune des opérations de sops n'est réalisée). Sinon
       semncnt (le décompte de threads en attente  jusqu'à  ce  que  cette  valeur  de  sémaphore
       devienne  zéro)  est  incrémenté  d'un  et  le  thread  s'endort  jusqu'à  ce que l'un des
       événements suivants se produise :

       •  semval devient supérieur ou égal à  la  valeur  absolue  de  sem_op :  l'opération  est
          effectuée comme décrit ci-dessus.

       •  Le  jeu  de  sémaphores  est supprimé. L'appel système échoue et errno contient le code
          d'erreur EIDRM.

       •  Le thread reçoit un signal à intercepter, la  valeur  de  semncnt  est  décrémentée  et
          l'appel système échoue avec errno contenant le code d'erreur EINTR.

       •  La  limite  temporelle  indiqué  par  timeout  dans  un semtimedop() a expiré : l'appel
          système échoue avec errno contenant EAGAIN.

       En cas de succès, le membre sempid de chacun  des  sémaphores  indiqués  dans  le  tableau
       pointé par sops est rempli avec le PID de l'appelant. Enfin sem_otime est défini à l'heure
       actuelle.

       La fonction semtimedop() se comporte comme semop() sauf que dans le cas où le thread  doit
       dormir, la durée maximale du sommeil est limitée par la valeur spécifiée dans la structure
       timespec dont l'adresse est transmise dans le paramètre timeout (cet intervalle de sommeil
       sera  arrondi  à  la  granularité  de l'horloge système, et les délais d'ordonnancement du
       noyau font que cette valeur peut être légèrement dépassée). Si la limite  indiquée  a  été
       atteinte,  l'appel système échoue avec errno contenant EAGAIN (et aucune opération de sops
       n'est réalisée). Si  le  paramètre  timeout  est  NULL,  alors  semtimedop()  se  comporte
       exactement comme semop().

VALEUR RENVOYÉE

       En  cas  de réussite, 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 supérieur à SEMOPM, le nombre maximal d'opérations  par  appel
              système.

       EACCES Le  processus  appelant  n'a  pas  les  permissions  nécessaires pour effectuer les
              opérations sur les sémaphores spécifiés et n'a pas la capacité CAP_IPC_OWNER.

       EAGAIN Une opération ne pouvait pas être  effectuée  immédiatement  et  IPC_NOWAIT  a  été
              indiqué dans l'argument sem_flg, ou la durée limite indiquée dans timeout a expiré.

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

       EFBIG  La  valeur  de  sem_num  est  inférieure  à  0  ou supérieure ou égale au nombre de
              sémaphores dans l'ensemble.

       EIDRM  Le jeu de sémaphores a été supprimé.

       EINTR  Un signal a été reçu pendant l'attente ; consultez signal(7).

       EINVAL L'ensemble de sémaphores n'existe pas ou semid est inférieur à zéro, ou nsops n'est
              pas strictement positive.

       ENOMEM L'argument  sem_flg  de certaines opérations demande SEM_UNDO et le système n'a pas
              assez de mémoire pour allouer les structures nécessaires.

       ERANGE sem_op+semval est supérieur à SEMVMX (la valeur maximale de  semval  autorisée  par
              l'implémentation) pour l'une des opérations.

VERSIONS

       semtimedop()  est apparu pour la première fois dans Linux 2.5.52, puis a été rétroporté au
       noyau 2.4.22. La gestion de semtimedop() dans la glibc date de la version 2.3.3.

CONFORMITÉ

       SVr4, POSIX.1-2001.

NOTES

       L'inclusion de <sys/types.h> et <sys/ipc.h> n'est  pas  nécessaire  sous  Linux  et  n'est
       exigée  par  aucune  version  de  POSIX.  Cependant,  certaines  implémentations anciennes
       nécessitent l'inclusion de ces  fichiers  d'en-tête,  et  le  SVID  documente  aussi  leur
       inclusion.  Les  applications  ayant  pour  but  d'être  portables  pourraient inclure ces
       fichiers d'en-tête.

       Les structures sem_undo d'un processus ne sont pas héritées  par  ses  enfants  lors  d'un
       fork(2), mais elles le sont lors d'un appel système execve(2).

       semop()   n'est   jamais  relancé  automatiquement  après  avoir  été  interrompu  par  un
       gestionnaire de  signal  quelque  soit  l'attribut  SA_RESTART  durant  l'installation  du
       gestionnaire.

       Une  valeur  de  mise  à jour de sémaphore (semadj) est un entier propre à un processus et
       sémaphore, qui représente le compte négatif des opérations utilisant l'attribut  SEM_UNDO.
       Chaque  processus dispose d'une liste de valeurs semadj — une valeur pour chaque sémaphore
       où SEM_UNDO a été utilisé. Quand un processus se termine, chacune des valeurs  semadj   de
       ses  sémaphores  est  ajoutée  au  sémaphore  correspondant,  annulant  ainsi  l'effet des
       opérations du processus sur le sémaphore (voir la section  BOGUES  ci-dessous).  Quand  la
       valeur  d'un  sémaphore  est  définie  directement  par  une  requête  SETVAL ou SETALL de
       semctl(2), la valeur semadj correspondante est effacée dans tous les processus.

       Les valeurs semval, sempid, semzcnt, et semnct pour un sémaphore peuvent  être  retrouvées
       avec des appels semctl(2) spécifiques.

       Les limites système suivantes concernent semop() :

       SEMOPM Nombre maximal d'opérations pour une appel à semop() (32). Sous Linux, cette limite
              peut être lue et modifiée via le troisième champ du fichier /proc/sys/kernel/sem.

       SEMVMX Valeur maximale pour semval : dépendante de l'implémentation (32767).

       L'implémentation n'a pas de limites intrinsèques pour la valeur maximale  d'effacement  en
       sortie  (SEMAEM),  le  nombre  de  structures  d'annulation sur le système (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  associées
       servent  à  annuler  les effets de toutes les opérations sur les sémaphores réalisées avec
       l'attribut SEM_UNDO. Ceci pose un problème : si l'une (ou plusieurs) des modifications sur
       les  sémaphores  demande  une  descente du compteur d'un sémaphore au-dessous de zéro, que
       doit faire l'implémentation ? Une approche possible consiste à bloquer jusqu'à ce  que  la
       modification  du sémaphore soit possible. C'est néanmoins peu désirable car la terminaison
       du processus peut alors bloquer pendant  une  période  arbitrairement  longue.  Une  autre
       possibilité  est d'ignorer la modification du sémaphore (comme un échec lorsque IPC_NOWAIT
       est spécifié durant une opération). Linux adopte une  troisième  approche :  décroître  la
       valeur  du  sémaphore  autant  que possible (jusqu'à zéro) et permettre au processus de se
       terminer immédiatement.

       Dans les noyaux 2.6.x (x <= 10) un bogue peut, dans certaines circonstances,  empêcher  un
       thread  attendant que la valeur d'un sémaphore s'annule d'être réveillé quand cette valeur
       atteint 0. Ce bogue est corrigé dans le noyau 2.6.11.

EXEMPLE

       Le bout de code suivant utilise semop() pour attendre de façon atomique que la  valeur  du
       sémaphore 0 vaille zéro, puis incrémente la valeur du sémaphore 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 égal à 0 */
           sops[0].sem_flg = 0;

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

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

VOIR AUSSI

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

COLOPHON

       Cette page fait partie de la publication 3.65 du projet man-pages Linux.  Une  description
       du  projet  et  des  instructions  pour  signaler  des  anomalies  peuvent être trouvées à
       l'adresse http://www.kernel.org/doc/man-pages/.

TRADUCTION

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

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

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