table of contents
other sections
SEMOP(2) | Manuel du programmeur Linux | SEMOP(2) |
NOM¶
semop, semtimedop - Opérations sur les sémaphoresSYNOPSIS¶
#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)) :
DESCRIPTION¶
Chaque sémaphore dans un ensemble de sémaphores 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 elle 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.
- •
- 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.
- •
- 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 » ( semadj) du sémaphore.
- •
- 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.
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.- 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).
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.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.44 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> ».27 août 2012 | Linux |