Provided by:
manpages-fr-dev_3.32d0.2p4-1_all 
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.32 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> >>.