Man page - sem_wait(3)

Packages contains this manual

Available languages:

en fr ja ru ro

Manual

sem_wait

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
ATTRIBUTS
STANDARDS
HISTORIQUE
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

NOM

sem_wait, sem_timedwait, sem_trywait - Verrouiller un sémaphore

BIBLIOTHÈQUE

BibliothĂšque de threads POSIX ( libpthread , -lpthread )

SYNOPSIS

#include <semaphore.h>

int sem_wait(sem_t * sem );
int sem_trywait(sem_t *
sem );
int sem_timedwait(sem_t *restrict
sem ,
const struct timespec *restrict
abs_timeout );

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

sem_timedwait () :
_POSIX_C_SOURCE >= 200112L

DESCRIPTION

sem_wait () dĂ©crĂ©mente (verrouille) le sĂ©maphore pointĂ© par sem . Si la valeur du sĂ©maphore est plus grande que zĂ©ro, la dĂ©crĂ©mentation s’effectue et la fonction renvoie immĂ©diatement. Si le sĂ©maphore vaut zĂ©ro, l’appel bloquera jusqu’à ce qu’il devienne possible d’effectuer la dĂ©crĂ©mentation (c’est-Ă -dire la valeur du sĂ©maphore devient positive) ou qu’un gestionnaire de signaux interrompe l’appel.

sem_trywait () est pareil Ă  sem_wait (), exceptĂ© que si la dĂ©crĂ©mentation ne peut pas ĂȘtre effectuĂ©e immĂ©diatement, l’appel renvoie une erreur ( errno vaut EAGAIN ) plutĂŽt que de bloquer.

sem_timedwait () est pareil Ă  sem_wait () exceptĂ© que abs_timeout spĂ©cifie une limite sur le temps pendant lequel l’appel bloquera si la dĂ©crĂ©mentation ne peut pas ĂȘtre effectuĂ©e immĂ©diatement. L’argument abs_timeout pointe sur une structure timespec (3) qui spĂ©cifie un temps absolu en secondes et nanosecondes depuis l’époque, 1er janvier 1970 à 00:00:00 (UTC).

Si le dĂ©lai est dĂ©jĂ  expirĂ© Ă  l’heure de l’appel et si le sĂ©maphore ne peut pas ĂȘtre verrouillĂ© immĂ©diatement, sem_timedwait () Ă©choue avec l’erreur d’expiration de dĂ©lai ( errno vaut ETIMEDOUT ).

Si l’opĂ©ration peut ĂȘtre effectuĂ©e immĂ©diatement, sem_timedwait () n’échoue jamais avec une valeur d’expiration de dĂ©lai, quelque soit la valeur de abs_timeout . De plus, la validitĂ© de abs_timeout n’est pas vĂ©rifiĂ©e dans ce cas.

VALEUR RENVOYÉE

Toutes ces fonctions renvoient 0 si elles rĂ©ussissent. Si elles Ă©chouent, la valeur du sĂ©maphore n’est pas modifiĂ©e, elles renvoient -1 et Ă©crivent errno en consĂ©quence.

ERREURS

EAGAIN

( sem_trywait ()) L’opĂ©ration ne peut pas ĂȘtre effectuĂ©e sans bloquer (c’est-Ă -dire, le sĂ©maphore a une valeur nulle).

EINTR

L’appel a Ă©tĂ© interrompu par un gestionnaire de signal ; consultez signal (7).

EINVAL

sem n’est pas un sĂ©maphore valable.

EINVAL

( sem_timedwait ()) La valeur de abs_timeout.tv_nsecs est plus petite que 0 ou supérieure ou égale à 1 milliard.

ETIMEDOUT

( sem_timedwait ()) Le dĂ©lai a expirĂ© avant que le sĂ©maphore ait pu ĂȘtre verrouillĂ©.

ATTRIBUTS

Pour une explication des termes utilisés dans cette section, consulter attributes (7).

Image grohtml-3873916-1.png

STANDARDS

POSIX.1-2008.

HISTORIQUE

POSIX.1-2001.

EXEMPLES

Le (quelque peu trivial) programme suivant opĂšre sur un sĂ©maphore non nommĂ©. Il attend deux arguments sur la ligne de commande. Le premier argument spĂ©cifie une valeur en secondes qui est utilisĂ©e pour configurer une alarme pour gĂ©nĂ©rer un signal SIGALRM . Ce gestionnaire effectue un sem_post (3) pour incrĂ©menter le sĂ©maphore qui est attendu dans le main() en utilisant sem_timedwait (). Le second argument de la ligne de commande spĂ©cifie la durĂ©e, en secondes, du dĂ©lai d’attente pour sem_timedwait (). Ci-dessous, le rĂ©sultat de deux exĂ©cutions diffĂ©rentes du programme :

$ ./a.out 2 3
main() est sur le point d’appeler sem_timedwait()
sem_post() depuis le gestionnaire
sem_timedwait() a réussi
$ ./a.out 2 1
main() est sur le point d’appeler sem_timedwait()
sem_timedwait() a expiré

Source du programme

#include <errno.h>
#include <semaphore.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <assert.h>
sem_t sem;
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
static void
handler(int sig)
{
write(STDOUT_FILENO, "sem_post() depuis le gestionnaire\n", 24);
if (sem_post(&sem) == -1) {
write(STDERR_FILENO, "sem_post() a échoué\n", 18);
_exit(EXIT_FAILURE);
}
}
int
main(int argc, char *argv[])
{
struct sigaction sa;
struct timespec ts;
int s;
if (argc != 3) {
fprintf(stderr, "Utilisation : %s <alarme-secs> <attente-secs>\n",
argv[0]);
exit(EXIT_FAILURE);
}
if (sem_init(&sem, 0, 0) == -1)
handle_error("sem_init");
/* Établit le gestionnaire de signal pour SIGALARM ;
fixe le chronomùtre de l’alarme selon argv[1]. */
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
if (sigaction(SIGALRM, &sa, NULL) == -1)
handle_error("sigaction");
alarm(atoi(argv[1]));
/* Calcule l’intervalle relatif comme l’heure actuelle plus
un certain nombre de secondes données dans argv[2]. */
if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
handle_error("clock_gettime");
ts.tv_sec += atoi(argv[2]);
printf("%s() est sur le point d’appeler sem_timedwait()\n");
while ((s = sem_timedwait(&sem, &ts)) == -1 && errno == EINTR)
continue; /* Redémarre si interrompu par le gestionnaire. */
/* Observe ce qui s’est passĂ©. */
if (s == -1) {
if (errno == ETIMEDOUT)
printf("sem_timedwait() a expiré\n");
else
perror("sem_timedwait");
} else
printf("sem_timedwait() a réussi\n");
exit((s == 0) ? EXIT_SUCCESS : EXIT_FAILURE);
}

VOIR AUSSI

clock_gettime (2), sem_getvalue (3), sem_post (3), timespec (3), sem_overview (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 .