SEMOP(2)

NOM
semop - 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 )

DESCRIPTION
Cette fonction effectue des operations sur les membres selectionnes 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 definie comme suit:
  short sem_num;  /* Numero du semaphore (0=premier) */
  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.

La semantique de cet appel systeme assure qu'un appel systeme ne sera effectue que si toutes ses operations reussissent. 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. 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 attend que semval soit nul. Plusieurs cas sont possibles : Si semval vaut zero, l'appel systeme continue immediatement Sinon, si l'on a reclame IPC_NOWAIT dans sem_flg, l'appel systeme echoue (en annulant les actions precedentes) et errno contient le code d'erreur EAGAIN. Autrement semzcnt est incremente de 1 et le processus s'endort jusqu'a ce que l'un des evenements suivants se produise :

    •   semval devient egal a 0, alors semzcnt est decremente. L'appel systeme continue

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

    •   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.
Le processus appelant doit avoir l'autorisation de lecture sur le jeu de semaphores.

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. Si SEM_UNDO est indique, le systeme met a jour le compteur "undo" du semaphore. Puis l'appel systeme continue. Autrement si l'on a reclame IPC_NOWAIT dans sem_flg, l'appel systeme echoue (annulant les actions precedentes et errno contient le code d'erreur EAGAIN. Sinon semncnt est decremente de un et le processus s'endort jusqu'a ce que l'un des evenements suivants se produise :

    •   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" du semaphore. Puis l'appel systeme continue.

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

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

en cas de succes, le membre sempid de la structure sem de chacun des semaphores indiques dans le tableau pointee par sops est rempli avec le PID du processus appelant. Enfin sem_otime et sem_ctime sont fixes a l'heure actuelle.

VALEUR RENVOYEE
renvoie la valeur 0, s'il reussit et -1 s'il echoue auquel cas errno contient le code d'erreur.

ERREURS

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 d'acces necessaires.

EAGAIN
    Une operation a echoue et IPC_NOWAIT a ete indique dans l'argument sem_flg.

EFAULT
    sops pointe en dehors de l'espace d'adressage accessible.

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

EIDRM
    Le jeu de semaphores a ete supprime.

EINTR
    Un signal a ete recu pendant l'attente.

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

ENOMEM
    Pas assez de memoire pour allouer les structures necessaires.

ERANGE
    semop + semval est superieur a SEMVMX.

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

Les limites systemes suivantes concernent semop :

SEMOPM
    Nombre maximal d'operations pour un appel systeme semop .

SEMVMX
    Valeur maximale pour semval.

BUGS
le systeme maintient une structure sem_undo par processus pour chaque semaphore modifie par le processus avec une requete "undo". Ces structures sont liberees a la sortie du processus. Le probleme principal avec le mecanisme undo est qu'il viole le principe d'un jeu d'operations elementaires sur les semaphores. La requete "undo" necessite une table et chaque semaphore peut avoir participe a de nombreux appels semopt. Le processus doit-il s'endormir en se terminant ou doit-il appliquer les operations undo avec un comportement IPC_NOWAIT ? Actuellement les operations "undo" qui reussissent immediatement sont appliquees, et les autres sont ignorees silencieusement. Il vaut donc mieux n'utiliser les requetes undo que dans le cas d'ensembles de semaphores prives.

CONFORMING TO
SVr4, SVID. SVr4 documente les conditions d'erreur supplementaires EINVAL, EFBIG, et ENOSPC.

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