Man page - semop(2)

Packages contains this manual

Available languages:

en fr pl ja ru

Manual

semop

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
semtimedop()
VALEUR RENVOYÉE
ERREURS
STANDARDS
VERSIONS
NOTES
Limites des sémaphores
BOGUES
EXEMPLES
VOIR AUSSI
TRADUCTION

NOM

semop, semtimedop - Opérations sur les sémaphores System V

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <sys/sem.h>

int semop(int semid , struct sembuf * sops , size_t nsops );
int semtimedop(int
semid , struct sembuf * sops , size_t nsops ,
const struct timespec *_Nullable
timeout );

Exigences de macros de test de fonctionnalités pour la glibc (consulter feature_test_macros (7)) :

semtimedop ():
_GNU_SOURCE

DESCRIPTION

Chaque sémaphore dans un ensemble de sémaphores System V 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 modifiant
la valeur du sémaphore */

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

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 soustrait la valeur sem_op Ă  la valeur de mise Ă  jour du sĂ©maphore ( semadj ). Cette opĂ©ration n’est jamais bloquante. Le processus appelant doit avoir l’autorisation de modification sur le jeu de sĂ©maphores.

Si sem_op vaut zĂ©ro le processus doit avoir l’autorisation de lecture sur l’ensemble de sĂ©maphores. Le processus attend que semval soit nul : si semval vaut zĂ©ro, l’appel systĂšme continue immĂ©diatement. Sinon, si l’on a rĂ©clamĂ© IPC_NOWAIT dans sem_flg , l’appel systĂšme semop () Ă©choue et errno contient le code d’erreur EAGAIN (et aucune des opĂ©rations de sops n’est rĂ©alisĂ©e). Sinon, semzcnt (le dĂ©compte de threads en attente jusqu’à ce que cette valeur de sĂ©maphore devienne zĂ©ro) est incrĂ©mentĂ© d’un et le thread s’endort jusqu’à ce que l’un des Ă©vĂ©nements suivants se produise :

-

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 .

Si sem_op est infĂ©rieur Ă  zĂ©ro, 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 semval , et si SEM_UNDO est indiquĂ©, le systĂšme ajoute la valeur absolue de sem_op Ă  la valeur de mise Ă  jour de sĂ©maphore ( semadj ) pour ce sĂ©maphore. Si la valeur absolue de sem_op est plus grande que semval et si l’on a rĂ©clamĂ© IPC_NOWAIT dans sem_flg , l’appel systĂšme Ă©choue et errno contient le code d’erreur EAGAIN (et aucune des opĂ©rations de sops n’est rĂ©alisĂ©e). Sinon, semncnt (le dĂ©compte de threads en attente jusqu’à ce que cette valeur de sĂ©maphore soit incrĂ©mentĂ©) est incrĂ©mentĂ© de un et le thread 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 : l’opĂ©ration est effectuĂ©e comme dĂ©crit ci-dessus.

-

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 .

En cas de succĂšs, le membre sempid de chacun des sĂ©maphores indiquĂ©s dans le tableau pointĂ© par sops est rempli avec le PID de l’appelant. Enfin sem_otime est dĂ©fini Ă  l’heure actuelle.

semtimedop()

La fonction semtimedop () se comporte comme semop () sauf que dans le cas oĂč le thread doit dormir, la durĂ©e maximale du sommeil est limitĂ©e par la valeur spĂ©cifiĂ©e dans la structure timespec dont l’adresse est transmise dans le paramĂštre timeout (cet intervalle de sommeil sera arrondi Ă  la granularitĂ© de l’horloge systĂšme, et les dĂ©lais d’ordonnancement du noyau font que cette valeur peut ĂȘtre lĂ©gĂšrement dĂ©passĂ©e). Si la limite indiquĂ©e a Ă©tĂ© atteinte, l’appel systĂšme Ă©choue avec errno contenant EAGAIN (et aucune opĂ©ration de sops n’est rĂ©alisĂ©e). Si le paramĂštre timeout est NULL, alors semtimedop () se comporte exactement comme semop ().

Si semtimedop () est interrompu par un signal, causant l’échec de l’appel avec l’erreur EINTR , les valeurs contenues dans timeout restent inchangĂ©es.

VALEUR RENVOYÉE

En cas de rĂ©ussite, semop () et semtimedop () renvoient 0 . En cas d’échec, ils renvoient -1 et errno contient le code d’erreur.

ERREURS

E2BIG

l’argument nsops est supĂ©rieur Ă  SEMOPM , le nombre maximal d’opĂ©rations autorisĂ©es 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 dans l’espace de noms utilisateur qui rĂ©git son espace de noms IPC.

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.

STANDARDS

POSIX.1-2008.

VERSIONS

Linux 2.5.52 (rétroportage dans Linux 2.4.22), glibc 2.3.3. POSIX.1-2001, SVr4.

NOTES

Les structures sem_undo d’un processus ne sont pas hĂ©ritĂ©es par ses enfants lors d’un fork (2), mais elles le sont lors d’un appel systĂšme execve (2).

semop () n’est jamais relancĂ© automatiquement aprĂšs avoir Ă©tĂ© interrompu par un gestionnaire de signal quelque soit l’attribut SA_RESTART durant l’installation du gestionnaire.

Une valeur de mise Ă  jour de sĂ©maphore ( semadj ) est un entier propre Ă  un processus et sĂ©maphore, qui reprĂ©sente le compte nĂ©gatif des opĂ©rations utilisant l’attribut SEM_UNDO . Chaque processus dispose d’une liste de valeurs semadj — une valeur pour chaque sĂ©maphore oĂč SEM_UNDO a Ă©tĂ© utilisĂ©. Quand un processus se termine, chacune des valeurs semadj de ses sĂ©maphores est ajoutĂ©e au sĂ©maphore correspondant, annulant ainsi l’effet des opĂ©rations du processus sur le sĂ©maphore (voir la section BOGUES ci-dessous). Quand la valeur d’un sĂ©maphore est dĂ©finie directement par une requĂȘte SETVAL ou SETALL de semctl (2), la valeur semadj correspondante est effacĂ©e dans tous les processus. L’option CLONE_SYSVSEM de clone (2) permet Ă  plusieurs processus de partager une liste de semadj . Consultez clone (2) pour plus d’informations.

Les valeurs semval , sempid , semzcnt et semnct pour un sĂ©maphore peuvent ĂȘtre retrouvĂ©es avec des appels semctl (2) spĂ©cifiques.

Limites des sémaphores

Les limites suivantes de ressources concernent l’appel systùme semop () :

SEMOPM

Nombre maximal d’opĂ©rations pour un appel Ă  semop . Avant Linux 3.19, la valeur par dĂ©faut pour cette limite Ă©tait de 32. Depuis Linux 3.19, cette valeur est de 500. Sous Linux, cette limite peut ĂȘtre lue et modifiĂ©e via le troisiĂšme champ du fichier /proc/sys/kernel/sem . Note : cette limite ne devrait pas ĂȘtre augmentĂ©e au-delĂ  de 1000 Ă  cause du risque que semop () Ă©choue en raison de la fragmentation de la mĂ©moire du noyau pendant l’allocation de mĂ©moire pour copier le tableau sops .

SEMVMX

Valeur maximale pour semval : dĂ©pendante de l’implĂ©mentation (32767).

L’implĂ©mentation n’a pas de limites intrinsĂšques pour la valeur maximale d’effacement en sortie ( SEMAEM ), le nombre de structures d’annulation sur le systĂšme ( 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 associĂ©es servent Ă  annuler les effets de toutes les opĂ©rations sur les sĂ©maphores rĂ©alisĂ©es avec l’attribut SEM_UNDO . Cela 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.

Dans Linux 2.6.x (x <= 10) un bogue peut, dans certaines circonstances, empĂȘcher un thread, attendant que la valeur d’un sĂ©maphore s’annule, d’ĂȘtre rĂ©veillĂ© quand cette valeur atteint 0. Ce bogue est corrigĂ© dans le Linux 2.6.11.

EXEMPLES

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 sémaphore 0 */
sops[0].sem_op = 0; /* Attendre que la valeur soit égale à 0 */
sops[0].sem_flg = 0;
sops[1].sem_num = 0; /* Agir sur le sémaphore 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);
}

Un autre exemple de l’usage de semop () peut ĂȘtre trouvĂ© dans shmop (2).

VOIR AUSSI

clone (2), semctl (2), semget (2), sigaction (2), capabilities (7), sem_overview (7), sysvipc (7), time (7)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Thomas Vincent <tvincent@debian.org> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .