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