dwww Home | Manual pages | Find package

timerfd_create(2)             System Calls Manual            timerfd_create(2)

NOM
       timerfd_create,  timerfd_settime,  timerfd_gettime - Minuteries qui in-
       forment par l'intermédiaire de descripteurs de fichier

BIBLIOTHÈQUE
       Bibliothèque C standard (libc, -lc)

SYNOPSIS
       #include <sys/timerfd.h>

       int timerfd_create(int clockid, int flags);

       int timerfd_settime(int fd, int flags,
                           const struct itimerspec *new_value,
                           struct itimerspec *_Nullable old_value);
       int timerfd_gettime(int fd, struct itimerspec *curr_value);

DESCRIPTION
       Ces appels système créent et opèrent sur une minuterie qui fournit  des
       notifications  d'expiration  par  un  descripteur de fichier. Ils four-
       nissent une alternative à setitimer(2) ou timer_create(2) avec  l'avan-
       tage  que le descripteur de fichier peut être surveillé avec select(2),
       poll(2) ou epoll(7).

       L'utilisation de ces trois appels système est analogue à  l'utilisation
       de timer_create(2), timer_settime(2) et timer_gettime(2). (Il n'y a pas
       d'équivalent à timer_getoverrun(2)  puisque  cette  fonctionnalité  est
       fournie par read(2), comme décrit ci-dessous)

   timerfd_create()
       timerfd_create()  crée un nouvel objet minuterie et renvoie un descrip-
       teur de fichier qui se réfère à cette minuterie. Le  paramètre  clockid
       indique  l'horloge utilisée pour marquer la progression de la minuterie
       qui doit être une des suivantes :

       CLOCK_REALTIME
              Une horloge temps réel configurable à l'échelle du système.

       CLOCK_MONOTONIC
              Une horloge non configurable, toujours croissante qui mesure  le
              temps  depuis  un  instant  non spécifié dans le passé et qui ne
              change pas après le démarrage du système.

       CLOCK_BOOTTIME (depuis Linux 3.15)
              C'est une horloge toujours croissante comme CLOCK_MONOTONIC. Ce-
              pendant  alors  que  l'horloge  CLOCK_MONOTONIC ne mesure pas le
              temps aussi longtemps que le  système  est  suspendu,  l'horloge
              CLOCK_BOOTTIME  inclut  le  temps  pendant lequel le système est
              suspendu. Cela est utile pour les applications qui doivent  être
              sensibles  au  temps  de  suspension.  CLOCK_REALTIME  n'est pas
              adapté à ce type d'application dans la mesure où  cette  horloge
              est  affectée  par  des  modifications discontinues de l'horloge
              système.

       CLOCK_REALTIME_ALARM (depuis Linux 3.11)
              Cette horloge se comporte comme CLOCK_REALTIME, mais  réveillera
              le  système s'il est suspendu. L'appelant doit avoir la capacité
              CAP_WAKE_ALARM afin de régler une minuterie utilisant cette hor-
              loge.

       CLOCK_BOOTTIME_ALARM (depuis Linux 3.11)
              Cette  horloge se comporte comme CLOCK_BOOTTIME, mais réveillera
              le système s'il est suspendu. L'appelant doit avoir la  capacité
              CAP_WAKE_ALARM afin de régler une minuterie utilisant cette hor-
              loge.

       Consultez clock_getres(2) pour quelques détails supplémentaires sur les
       horloges mentionnées.

       La  valeur  actuelle  de chacune de ces horloges peut être obtenue avec
       clock_gettime(2).

       À partir de Linux 2.6.27, les valeurs suivantes peuvent  être  incluses
       avec  un  OU  binaire  dans  flags  pour changer le comportement de ti-
       merfd_create() :

       TFD_NONBLOCK  Placer l'attribut d'état de  fichier  O_NONBLOCK  sur  la
                     description  du  fichier ouvert référencée par le nouveau
                     descripteur de fichier (consulter open(2)). Utiliser  cet
                     attribut  économise des appels supplémentaires à fcntl(2)
                     pour obtenir le même résultat.

       TFD_CLOEXEC   Placer l'attribut « close-on-exec » (FD_CLOEXEC)  sur  le
                     nouveau  descripteur de fichier. Consultez la description
                     de l'attribut O_CLOEXEC dans open(2) pour savoir pourquoi
                     cela peut être utile.

       Dans  les  versions  de  Linux jusqu'à la version 2.6.26 incluse, flags
       doit être nul.

   timerfd_settime()
       timerfd_settime() arme (démarre) ou désarme (stoppe) la minuterie à la-
       quelle se réfère le descripteur de fichier fd.

       Le  paramètre  new_value spécifie l'expiration initiale et l'intervalle
       de la minuterie. La structure itimerspec utilisée pour ce paramètre est
       décrite dans itimerspec(3type) :

       new_value.it_value  spécifie  l'expiration initiale de la minuterie, en
       secondes et nanosecondes. Une valeur non nulle dans un  des  champs  de
       new_value.it_value  arme la minuterie. La minuterie est désarmée si les
       deux champs de new_value.it_value sont mis à zéro.

       Une valeur non nulle dans un des champs de new_value.it_interval confi-
       gure la période, en secondes et nanosecondes, pour une expiration répé-
       titive après l'expiration initiale.  Si  les  deux  champs  de  new_va-
       lue.it_interval  sont  nuls,  la  minuterie expirera qu'une seule fois,
       dont l'heure est spécifiée dans new_value.it_value.

       Par défaut, l'heure d'expiration initiale spécifiée dans new_value  est
       interprétée de façon relative par rapport à l'heure actuelle sur l'hor-
       loge de la minuterie au moment de  l'appel  (c'est-à-dire  que  new_va-
       lue.it_value  indique une heure relative à la valeur actuelle de l'hor-
       loge spécifiée par clockid). Un délai absolu peut être sélectionné avec
       le paramètre flags.

       Le  paramètre  flags  est  un masque de bits qui peut avoir les valeurs
       suivantes :

       TFD_TIMER_ABSTIME
              Interpréter new_value.it_value  comme  une  valeur  absolue  sur
              l'horloge de la minuterie. La minuterie expirera quand la valeur
              de l'horloge de la minuterie atteint la  valeur  spécifiée  dans
              new_value.it_value.

       TFD_TIMER_CANCEL_ON_SET
              Si cet attribut est spécifié en même temps que TFD_TIMER_ABSTIME
              et si l'horloge  pour  cette  minuterie  est  CLOCK_REALTIME  ou
              CLOCK_REALTIME_ALARM,  alors marquer cette minuterie comme annu-
              lable si l'horloge en temps réel subit une modification  discon-
              tinue  (settimeofday(2),  clock_settime(2)  ou similaire). Quand
              des modifications se produisent, un  appel  actuel  ou  futur  à
              read(2)  à  partir du descripteur de fichier échouera avec l’er-
              reur ECANCELED.

       Si le paramètre old_value n'est pas égal à NULL, la structure  itimers-
       pec vers laquelle il pointe est utilisée pour renvoyer la configuration
       de la minuterie au moment de l'appel ; consultez la description de  ti-
       merfd_gettime() ci-dessous.

   timerfd_gettime()
       timerfd_gettime()  renvoie,  dans  curr_value, une structure itimerspec
       qui contient les paramètres actuels de la minuterie auquel le  descrip-
       teur de fichier fd fait référence.

       Le  champ it_value renvoie la durée jusqu'à la prochaine expiration. Si
       les deux champs de cette structure sont nuls, alors  la  minuterie  est
       actuellement  désactivée.  Ce  champ contient toujours une valeur rela-
       tive, sans tenir compte d'un attribut TFD_TIMER_ABSTIME qui aurait  été
       spécifié quand la minuterie a été configurée.

       Le  champ it_interval renvoie l'intervalle de la minuterie. Si les deux
       champs de cette structure sont nuls, alors la minuteries est configurée
       pour  n'expirer  qu'une  seule  fois,  à l'heure spécifiée par curr_va-
       lue.it_value.

   Opérations sur un descripteur de fichier de minuterie
       Le descripteur de fichier renvoyé par timerfd_create() gère les  opéra-
       tions supplémentaires suivantes :

       read(2)
              Si  la  minuterie  a déjà expirée une fois ou plus depuis que sa
              configuration a été modifiée la dernière fois à  l'aide  de  ti-
              merfd_settime() ou depuis la dernière lecture avec read(2) qui a
              réussi, alors le tampon fourni à read(2) renvoie un  entier  non
              signé  sur  8 octets (uint64_t) qui contient le nombre d'expira-
              tions qui se sont produites. (La valeur renvoyée utilise l'ordre
              des octets de l'hôte, c'est-à-dire l'ordre des octets natif pour
              les entiers sur la machine hôte.)

              Si aucune expiration ne s'est produite au moment  de  l'appel  à
              read(2),  l'appel  bloquera  jusqu'à  la prochaine expiration ou
              échouera avec l'erreur EAGAIN si le descripteur de  fichier  est
              en  mode  non  bloquant  (à  l'aide de de l'opération F_SETFL de
              fcntl(2) pour régler l'attribut O_NONBLOCK).

              Un read(2) échouera avec l'erreur EINVAL si la taille du  tampon
              fourni est de moins de 8 octets.

              Si  l'horloge  associée  est  soit CLOCK_REALTIME ou CLOCK_REAL-
              TIME_ALARM, si la minuterie est absolue  (TFD_TIMER_ABSTIME)  et
              si  l'attribut  TFD_TIMER_CANCEL_ON_SET  a  été spécifié lors de
              l'appel timerfd_settime(), alors l'appel à read(2)  échoue  avec
              l'erreur  ECANCELED si l'horloge en temps réel subit une modifi-
              cation discontinue. (Cela permet à l'application qui lit de  dé-
              couvrir ce type de modifications discontinues à l'horloge.)

              Si  l'horloge  associée  est  soit CLOCK_REALTIME ou CLOCK_REAL-
              TIME_ALARM, si la minuterie est absolue  (TFD_TIMER_ABSTIME)  et
              si  l'attribut  TFD_TIMER_CANCEL_ON_SET  a  été spécifié lors de
              l'appel timerfd_settime(), alors une modification négative  dis-
              continue  à l'horloge (par exemple, clock_settime(2)) peut faire
              à que read(2) supprime le blocage, mais renvoie une valeur de  0
              (c'est-à-dire  qu'aucun  octet  n'est  lu),  si une modification
              d'horloge survient après que le temps soit expiré, mais avant le
              read(2) sur le descripteur de fichier.

       poll(2), select(2) (et similaire)
              Le  descripteur  de fichier est lisible (le paramètre readfds de
              select(2) ; l'attribut POLLIN de poll(2)) si une expiration  (ou
              plus) de la minuterie s'est produite.

              Le  descripteur  de fichier prend également en charge les autres
              interfaces de multiplexage de  descripteurs  de  fichier :  pse-
              lect(2), ppoll(2) et epoll(7).

       ioctl(2)
              La commande suivante spécifique à timerfd est prise en charge :

              TFD_IOC_SET_TICKS (depuis Linux 3.17)
                     Ajuste le nombre d'expirations de minuterie qui sont sur-
                     venues. Le paramètre est un pointeur vers  un  entier  de
                     8 octets  différent de zéro (uint64_t*) contenant le nou-
                     veau nombre d'expirations. Une fois que le nombre est dé-
                     fini,  tout  processus en attente de la minuterie est ré-
                     veillé. Le seul objectif de cette commande est  de  réta-
                     blir les expirations dans l'objectif de points de vérifi-
                     cation ou de restauration. Cette opération est disponible
                     seulement  si  le  noyau  a  été  configuré avec l'option
                     CONFIG_CHECKPOINT_RESTORE.

       close(2)
              Quand le descripteur de fichier n'est plus  nécessaire  il  doit
              être  fermé.  Quand tous les descripteurs de fichier associés au
              même objet minuterie ont été fermés, la minuterie  est  désarmée
              et ses ressources sont libérées par le noyau.

   Sémantique de fork(2)
       Après un fork(2), l'enfant hérite d'une copie du descripteur de fichier
       créé par timerfd_create(). Le descripteur de fichier se réfère au  même
       objet minuterie sous-jacent que le descripteur de fichier correspondant
       dans le parent, et un read(2) de l'enfant renverra les informations sur
       les expirations de la minuterie.

   Sémantique de execve(2)
       Un  descripteur  de  fichier  créé par timerfd_create() est conservé au
       travers d'un execve(2), et continue à générer des expirations de  minu-
       terie si la minuterie a été armée.

VALEUR RENVOYÉE
       S'il  réussit,  timerfd_create()  renvoie un nouveau descripteur de fi-
       chier. En cas d'erreur, il renvoie -1 et errno est défini pour indiquer
       l'erreur.

       En cas de réussite, timerfd_settime() et timerfd_gettime() renvoient 0.
       Sinon ils renvoient -1 et définissent errno pour indiquer l'erreur.

ERREURS
       timerfd_create() peut échouer avec les erreurs suivantes :

       EINVAL Le clockid n'est pas valable.

       EINVAL flags n'est pas correct ; ou, pour les versions de  Linux 2.6.26
              ou antérieures, flags n'est pas nul.

       EMFILE La  limite du nombre de descripteurs de fichiers par processus a
              été atteinte.

       ENFILE La limite du nombre total de fichiers ouverts  pour  le  système
              entier a été atteinte.

       ENODEV Impossible  de  monter  (en  interne)  le  périphérique  anonyme
              d'inœud.

       ENOMEM Pas assez de mémoire noyau pour créer la minuterie.

       EPERM  clockid était CLOCK_REALTIME_ALARM ou CLOCK_BOOTTIME_ALARM, mais
              l'appelant n'a pas la capacité CAP_WAKE_ALARM.

       timerfd_settime() et timerfd_gettime() peuvent échouer avec les erreurs
       suivantes :

       EBADF  fd n'est pas un descripteur de fichier valable.

       EFAULT new_value, old_value ou curr_value n'est  pas  un  pointeur  va-
              lable.

       EINVAL fd n'est pas un descripteur de fichier de minuterie valable.

       timerfd_settime() peut aussi échouer avec les erreurs suivantes :

       ECANCELED
              Voir NOTES

       EINVAL new_value  n'est  pas  initialisé  correctement  (un  des champs
              tv_nsec est en dehors de l'intervalle allant  de  0  à  999  999
              999).

       EINVAL flags n'est pas correct.

VERSIONS
       Ces  appels  système  sont disponibles depuis Linux 2.6.25. La prise en
       charge de la bibliothèque est fournie depuis la glibc 2.8.

STANDARDS
       Ces appels système sont spécifiques à Linux.

NOTES
       En supposant le scénario suivant pour une minuterie  CLOCK_REALTIME  ou
       CLOCK_REALTIME_ALARM créée avec timerfd_create() :

       (1)  la minuterie a été démarrée (timerfd_settime()) avec les attributs
            TFD_TIMER_ABSTIME et TFD_TIMER_CANCEL_ON_SET ;

       (2)  une modification discontinue (par  exemple,  settimeofday(2))  est
            ensuite appliquée à l'horloge CLOCK_REALTIME ;

       (3)  l'appelant appelle une fois de plus timerfd_settime() pour réarmer
            la minuterie (sans exécuter préalablement un read(2) sur  le  des-
            cripteur de fichier).

       Dans ce cas les événements suivants se produisent :

       •  timerfd_settime()  renvoie  -1  avec errno défini à ECANCELED. (Cela
          permet à l'appelant de savoir que la minuterie précédente a été  af-
          fectée par une modification discontinue de l'horloge.)

       •  La  minuterie est réarmée avec succès avec les réglages fournis dans
          le second appel timerfd_settime(). (C'est probablement  un  accident
          d'implémentation,  mais ne sera pas corrigé maintenant au cas où des
          applications dépendent de ce comportement.)

BOGUES
       Actuellement, timerfd_create() prend en charge moins de types d'identi-
       fiant d'horloges que timer_create(2).

EXEMPLES
       Le  programme suivant crée une minuterie puis surveille sa progression.
       Le programme accepte jusqu'à trois paramètres en ligne de commande.  Le
       premier paramètre spécifie le nombre de secondes pour l'expiration ini-
       tiale de la minuterie. Le deuxième paramètre spécifie l'intervallse  de
       la minuterie, en secondes. Le troisième paramètre spécifie le nombre de
       fois que le programme doit permettre à la minuterie d'expirer avant  de
       quitter. Le deuxième et le troisième paramètre sont optionnels.

       La session interactive suivante montre l'utilisation de ce programme :

           $ a.out 3 1 100
           0.000: timer started
           3.000: read: 1; total=1
           4.000: read: 1; total=2
           ^Z                 # entrer Ctrl-Z pour suspendre le programme
           [1]+  Stopped                 ./timerfd3_demo 3 1 100
           $ fg                # Reprendre l'exécution après quelques secondes
           a.out 3 1 100
           9.660: read: 5; total=7
           10.000: read: 1; total=8
           11.000: read: 1; total=9
           ^C                  # entrer Ctrl-C pour suspendre le programme

   Source du programme

       #include <err.h>
       #include <inttypes.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <sys/timerfd.h>
       #include <time.h>
       #include <unistd.h>

       static void
       print_elapsed_time(void)
       {
           int                     secs, nsecs;
           static int              first_call = 1;
           struct timespec         curr;
           static struct timespec  start;

           if (first_call) {
               first_call = 0;
               if (clock_gettime(CLOCK_MONOTONIC, &start) == -1)
                   err(EXIT_FAILURE, "clock_gettime");
           }

           if (clock_gettime(CLOCK_MONOTONIC, &curr) == -1)
               err(EXIT_FAILURE, "clock_gettime");

           secs = curr.tv_sec - start.tv_sec;
           nsecs = curr.tv_nsec - start.tv_nsec;
           if (nsecs < 0) {
               secs--;
               nsecs += 1000000000;
           }
           printf("%d.%03d: ", secs, (nsecs + 500000) / 1000000);
       }

       int
       main(int argc, char *argv[])
       {
           int                fd;
           ssize_t            s;
           uint64_t           exp, tot_exp, max_exp;
           struct timespec    now;
           struct itimerspec  new_value;

           if (argc != 2 && argc != 4) {
               fprintf(stderr, "%s init-secs [interval-secs max-exp]\n",
                       argv[0]);
               exit(EXIT_FAILURE);
           }

           if (clock_gettime(CLOCK_REALTIME, &now) == -1)
               err(EXIT_FAILURE, "clock_gettime");

           /* Créer une minuterie absolue CLOCK_REALTIME avec une expiration
              et un intervalle initiaux comme spécifié en ligne de commande. */

           new_value.it_value.tv_sec = now.tv_sec + atoi(argv[1]);
           new_value.it_value.tv_nsec = now.tv_nsec;
           if (argc == 2) {
               new_value.it_interval.tv_sec = 0;
               max_exp = 1;
           } else {
               new_value.it_interval.tv_sec = atoi(argv[2]);
               max_exp = atoi(argv[3]);
           }
           new_value.it_interval.tv_nsec = 0;

           fd = timerfd_create(CLOCK_REALTIME, 0);
           if (fd == -1)
               err(EXIT_FAILURE, "timerfd_create");

           if (timerfd_settime(fd, TFD_TIMER_ABSTIME, &new_value, NULL) == -1)
               err(EXIT_FAILURE, "timerfd_settime");

           print_elapsed_time();
           printf("timer started\n");

           for (tot_exp = 0; tot_exp < max_exp;) {
               s = read(fd, &exp, sizeof(uint64_t));
               if (s != sizeof(uint64_t))
                   err(EXIT_FAILURE, "read");

               tot_exp += exp;
               print_elapsed_time();
               printf("read: %" PRIu64 "; total=%" PRIu64 "\n", exp, tot_exp);
           }

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI
       eventfd(2), poll(2), read(2), select(2), setitimer(2), signalfd(2), ti-
       mer_create(2),   timer_gettime(2),    timer_settime(2),    timespec(3),
       epoll(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>,  Cédric  Boutillier  <ce-
       dric.boutillier@gmail.com>,  Frédéric Hantrais <fhantrais@gmail.com> 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   5 février 2023               timerfd_create(2)

Generated by dwww version 1.15 on Sat Jun 29 01:44:02 CEST 2024.