Man page - timerfd_create(2)

Packages contains this manual

Available languages:

en fr ja ru

Manual

timerfd_create

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
timerfd_create()
timerfd_settime()
timerfd_gettime()
Opérations sur un descripteur de fichier de minuterie
Sémantique de fork(2)
Sémantique de execve(2)
VALEUR RENVOYÉE
ERREURS
STANDARDS
HISTORIQUE
NOTES
BOGUES
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

NOM

timerfd_create, timerfd_settime, timerfd_gettime - Minuteries qui informent 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 fournissent une alternative Ă  setitimer (2) ou timer_create (2) avec l’avantage 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 descripteur 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 . Cependant 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 horloge.

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

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 timerfd_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 à laquelle 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 configure la pĂ©riode, en secondes et nanosecondes, pour une expiration rĂ©pĂ©titive aprĂšs l’expiration initiale. Si les deux champs de new_value.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’horloge de la minuterie au moment de l’appel (c’est-Ă -dire que new_value.it_value indique une heure relative Ă  la valeur actuelle de l’horloge 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 annulable si l’horloge en temps rĂ©el subit une modification discontinue ( 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’erreur ECANCELED .

Si le paramĂštre old_value n’est pas Ă©gal Ă  NULL, la structure itimerspec vers laquelle il pointe est utilisĂ©e pour renvoyer la configuration de la minuterie au moment de l’appel ; consultez la description de timerfd_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 descripteur 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 relative, 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_value.it_value .

Opérations sur un descripteur de fichier de minuterie

Le descripteur de fichier renvoyé par timerfd_create () gÚre les opérations 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 timerfd_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’expirations 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_REALTIME_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 modification 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_REALTIME_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 discontinue Ă  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 : pselect (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 survenues. Le paramĂštre est un pointeur vers un entier de 8 octets diffĂ©rent de zĂ©ro ( uint64_t *) contenant le nouveau 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Ă©tablir les expirations dans l’objectif de points de vĂ©rification 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 minuterie si la minuterie a Ă©tĂ© armĂ©e.

VALEUR RENVOYÉE

S’il rĂ©ussit, timerfd_create () renvoie un nouveau descripteur de fichier. 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 valable.

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.

STANDARDS

Linux.

HISTORIQUE

Linux 2.6.25, glibc 2.8.

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 descripteur 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Ă© affectĂ©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’identifiant 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 initiale 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 <sys/types.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), timer_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 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>, Cédric Boutillier <cedric.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 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 .