dwww Home | Manual pages | Find package

sem_wait(3)                Library Functions Manual                sem_wait(3)

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'ef-
       fectue 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éci-
       fie 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 blo-
              quer (c'est-à-dire, le sémaphore a une valeur nulle).

       EINTR  L'appel a été interrompu par un gestionnaire de signal ; consul-
              tez signal(7).

       EINVAL sem n'est pas un sémaphore valable.

       EINVAL (sem_timedwait()) La valeur de abs_timeout.tv_nsecs est plus pe-
              tite 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).

       ┌─────────────────────────────────────┬──────────────────────┬─────────┐
       │InterfaceAttributValeur  │
       ├─────────────────────────────────────┼──────────────────────┼─────────┤
       │sem_wait(), sem_trywait(),           │ Sécurité des threads │ MT-Safe │
       │sem_timedwait()                      │                      │         │
       └─────────────────────────────────────┴──────────────────────┴─────────┘

STANDARDS
       POSIX.1-2001, POSIX.1-2008.

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 configu-
       rer 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, "Usage : %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_over-
       view(7), time(7)

TRADUCTION
       La traduction française de cette page de manuel a été créée par  Chris-
       tophe  Blaess  <https://www.blaess.fr/christophe/>, Stéphan Rafin <ste-
       phan.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.cou-
       lon@wanadoo.fr>,  Julien  Cristau <jcristau@debian.org>, Thomas Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François  <nicolas.francois@centra-
       liens.net>,  Florentin  Duneau <fduneau@gmail.com>, Simon Paillard <si-
       mon.paillard@resel.enst-bretagne.fr>,   Denis   Barbier    <barbier@de-
       bian.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
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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⟩.

Pages du manuel de Linux 6.03  15 décembre 2022                    sem_wait(3)

Generated by dwww version 1.15 on Sat Jun 29 00:40:27 CEST 2024.