SEMOP(2)           Manuel du programmeur Linux           SEMOP(2)


NOM
       semop - Opérations sur les sémaphores.

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

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

DESCRIPTION
       Cette fonction effectue des  opérations  sur  les  membres
       sélectionnés  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 définie
       comme suit:

         short sem_num;  /* Numero du sémaphore (0=premier) */
         short sem_op;   /* Oéeration 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.

       La  sémantique  de  cet  appel  système assure qu'un appel
       système ne sera effectué  que  si  toutes  ses  opérations
       réussissent.    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 met  à  jour  le  compteur  "undo"  du
       sémaphore.   Cette  opération  n'est jamais bloquante.  Le
       processus appelant doit avoir l'autorisation de  modifica­
       tion sur le jeu de sémaphores.

       Si  sem_op  vaut  zéro le processus attend que semval soit
       nul. Plusieurs cas sont possibles :

       Si semval vaut zéro, l'appel système  continue  immédiate­
       ment

       Sinon,  si l'on a reclamé IPC_NOWAIT dans sem_flg, l'appel
       système échoue (en annulant les  actions  précédentes)  et
       errno contient le code d'erreur EAGAIN.

       Autrement  semzcnt  est  incrementé  de  1 et le processus
       s'endort jusqu'à ce que l'un des  évènements  suivants  se
       produise :



Linux                      8 Avril 1997                         1





SEMOP(2)           Manuel du programmeur Linux           SEMOP(2)


              ·      semval  devient  égal à 0, alors semzcnt est
                     décrémenté. L'appel système continue

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

              ·      Le processus 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.

       Le processus appelant doit avoir l'autorisation de lecture
       sur le jeu de sémaphores.

       Si sem_op est inférieur à zero, 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 sem­
       val.  Si SEM_UNDO est indiqué, le système met  à  jour  le
       compteur  "undo"  du  sémaphore. Puis l'appel système con­
       tinue.   Autrement  si  l'on  a  réclamé  IPC_NOWAIT  dans
       sem_flg,  l'appel  système  échoue  (annulant  les actions
       précédentes et errno contient  le  code  d'erreur  EAGAIN.
       Sinon  semncnt  est  décrémenté  de  un  et  le  processus
       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, alors la  valeur  semncnt
                     est décrémentée, la valeur absolue de sem_op
                     est soustraite de semval et si SEM_UNDO  est
                     demandé  le  système  met à jour le compteur
                     "undo" du sémaphore.  Puis  l'appel  système
                     continue.

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

              ·      Le processus 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.

       en cas de succès, le membre sempid de la structure sem  de
       chacun  des sémaphores indiqués dans le tableau pointé par
       sops est rempli avec le PID du processus appelant.   Enfin
       sem_otime et sem_ctime sont fixés à l'heure actuelle.





Linux                      8 Avril 1997                         2





SEMOP(2)           Manuel du programmeur Linux           SEMOP(2)


VALEUR RENVOYÉE
       renvoie la valeur 0, s'il réussit et -1 s'il échoue auquel
       cas errno contient le code d'erreur.

ERREURS
       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
                  d'accès nécéssaires.

       EAGAIN     Une  operation  a  échoué  et  IPC_NOWAIT a été
                  indiqué dans l'argument sem_flg.

       EFAULT     sops pointe 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.

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

       ENOMEM     Pas  assez  de  mémoire pour allouer les struc­
                  tures nécessaires.

       ERANGE     semop + semval est supérieur à SEMVMX.

NOTES
       Les  structures  sem_undo  d'un  processus  ne  sont   pas
       héritées  par  ses  enfants lors d'un fork(2).  par contre
       elles sont transmises lors d'un execve(2).

       Les limites système suivantes concernent semop :

       SEMOPM     Nombre  maximal  d'opérations  pour  un   appel
                  système semop .

       SEMVMX     Valeur maximale pour semval.


BUGS
       Le  système maintient une structure sem_undo par processus
       pour chaque sémaphore modifié par le  processus  avec  une
       requête  "undo".  Ces structures sont libérées à la sortie
       du processus. Le probleme principal avec le mécanisme undo
       est  qu'il viole le principe d'un jeu d'opérations élémen­
       taires sur les sémaphores.  La  requête  "undo"  nécessite



Linux                      8 Avril 1997                         3





SEMOP(2)           Manuel du programmeur Linux           SEMOP(2)


       une  table  et  chaque sémaphore peut avoir participé à de
       nombreux appels semopt.  Le processus  doit-il  s'endormir
       en  se  terminant ou doit-il appliquer les opérations undo
       avec  un  comportement  IPC_NOWAIT  ?   Actuellement   les
       opérations   "undo"  qui  réussissent  immédiatement  sont
       appliquées, et les autres sont  ignorées  silencieusement.
       Il  vaut  donc mieux n'utiliser les requêtes undo que dans
       le cas d'ensembles de sémaphores privés.

CONFORMITÉ
       SVr4,  SVID.   SVr4  documente  les  conditions   d'erreur
       supplémentaires EINVAL, EFBIG, et ENOSPC.

VOIR AUSSI
       ipc(5), semctl(2), semget(2).


TRADUCTION
       Christophe Blaess, 1997.






































Linux                      8 Avril 1997                         4