Provided by: manpages-fr-dev_4.26.0-1_all 

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.
Pages du manuel de Linux 6.9.1 15 juin 2024 timerfd_create(2)