Man page - clock_getres(2)

Packages contains this manual

Available languages:

en fr ja ru

Manual

clock_getres

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
Horloges dynamiques
VALEUR RENVOYÉE
ERREURS
ATTRIBUTS
VERSIONS
Différences entre bibliothÚque C et noyau
STANDARDS
HISTORIQUE
Note historique pour les systĂšmes multiprocesseurs (SMP)
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

NOM

clock_getres, clock_gettime, clock_settime - Fonctions d’horloge et de temps

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc ), depuis la glibc 2.17

Avant la glibc 2.17, bibliothÚque de temps réel ( librt , -lrt )

SYNOPSIS

#include <time.h>

int clock_getres(clockid_t clockid , struct timespec *_Nullable res );

int clock_gettime(clockid_t clockid , struct timespec * tp );
int clock_settime(clockid_t
clockid , const struct timespec * tp );

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

clock_getres (), clock_gettime (), clock_settime () :
_POSIX_C_SOURCE >= 199309L

DESCRIPTION

La fonction clock_getres () cherche la rĂ©solution (prĂ©cision) de l’horloge clockid spĂ©cifiĂ©e et si res est non NULL, elle l’enregistre dans la structure timespec pointĂ©e par res . La rĂ©solution des horloges dĂ©pend de l’implĂ©mentation et ne peut pas ĂȘtre configurĂ©e par un processus particulier. Si la valeur du temps pointĂ© par l’argument tp de clock_settime () n’est pas un multiple de res , cette valeur est tronquĂ©e Ă  un multiple de res .

Les fonctions clock_gettime () et clock_settime () rĂ©cupĂšrent et configurent le temps de l’horloge clockid spĂ©cifiĂ©e.

Les arguments res et tp sont des structures timespec (3).

L’argument clockid est l’identifiant d’une horloge particuliĂšre sur laquelle agir. Une horloge peut ĂȘtre globale au systĂšme, et par consĂ©quent visible de tous les processus, ou propre Ă  un processus, si elle mesure le temps uniquement pour celui-ci.

Toutes les implĂ©mentations prennent en charge l’horloge temps rĂ©el globale, laquelle est identifiĂ©e par CLOCK_REALTIME . Son temps reprĂ©sente le nombre de secondes et nanosecondes Ă©coulĂ©es depuis l’époque UNIX (1er janvier 1970 à 00:00:00 UTC). Lorsque son temps est modifiĂ©, les horloges mesurant un intervalle de temps ne sont pas affectĂ©es alors que celles indiquant une date (heure) absolue le sont.

Plusieurs horloges peuvent ĂȘtre implĂ©mentĂ©es. L’interprĂ©tation des valeurs de temps correspondantes et l’effet sur les temporisateurs ne sont pas spĂ©cifiĂ©s.

Les versions suffisamment récentes de la glibc et du noyau Linux gÚrent les horloges suivantes :
CLOCK_REALTIME

Horloge systĂšme rĂ©glable qui mesure le temps rĂ©el (c’est-Ă -dire comme une pendule). Modifier cette horloge nĂ©cessite des privilĂšges adĂ©quats. Cette horloge est concernĂ©e par les sauts discontinus de l’heure systĂšme (par exemple si l’administrateur modifie l’heure lui-mĂȘme), et par les ajustements de frĂ©quence effectuĂ©s par NTP et les applications similaires au moyen d’ adjtime (3), adjtimex (2), clock_adjtime (2) et ntp_adjtime (3). Cette horloge compte normallement le nombre de secondes depuis 1970-01-01 00:00:00 UTC (Coordinated Universal Time) sauf qu’elle ignore les secondes intercalaires ; environ une seconde intercalaires est habituellement ajustĂ©e par NTP pour rester grossiĂšrement synchrone avec l’UTC.

CLOCK_REALTIME_ALARM (depuis Linux 3.0 ; spécifique à Linux)

Comme CLOCK_REALTIME , mais non réglable. Voir timer_create (2) pour plus de détails.

CLOCK_REALTIME_COARSE (depuis Linux 2.6.32 ; spécifique à Linux)

Horloge plus rapide mais moins prĂ©cise que CLOCK_REALTIME . Cette horloge n’est pas rĂ©glable. À utiliser pour obtenir rapidement des donnĂ©es d’horodatage avec une rĂ©solution grossiĂšre. Elle exige une prise en charge spĂ©cifique Ă  chaque architecture et probablement d’ĂȘtre prise en charge par une architecture dans vdso (7).

CLOCK_TAI (depuis Linux 3.10 ; spécifique à Linux)

Horloge systĂšme non rĂ©glable dĂ©rivĂ©e d’une pendule mais comptant les secondes intercalaires. Cette horloge ne connaĂźt ni discontinuitĂ©s ni ajustements de frĂ©quence suite Ă  des insertions de secondes intercalaires comme le fait CLOCK_REALTIME .

L’acronyme TAI renvoie Ă  « International Atomic Time » (temps international atomique).

CLOCK_MONOTONIC

Horloge systĂšme non rĂ©glable qui reprĂ©sente le temps monotone depuis — selon POSIX — « some unspecified point in the past » (un point indĂ©fini du passĂ©). Sur Linux, ce point correspond au nombre de secondes passĂ©es depuis le dernier dĂ©marrage du systĂšme.

L’horloge CLOCK_MONOTONIC n’est pas concernĂ©e par les sauts discontinus de l’heure systĂšme (par exemple si l’administrateur modifie l’heure lui-mĂȘme), mais est affectĂ©e par des ajustements frĂ©quence. Cette horloge ne compte pas le temps durant lequel le systĂšme est en veille. Toutes les variantes de CLOCK_MONOTONIC garantissent que le temps renvoyĂ© par des appels consĂ©cutifs ne crĂ©eront pas de retour en arriĂšre, tandis que les appels successifs — selon l’architecture — renvoient des valeurs temporelles identiques (sans augmentation).

CLOCK_MONOTONIC_COARSE (depuis Linux 2.6.32 ; spécifique à Linux)

Horloge plus rapide mais moins prĂ©cise que CLOCK_MONOTONIC . À utiliser pour obtenir rapidement des donnĂ©es d’horodatage avec une rĂ©solution grossiĂšre. Elle exige une prise en charge spĂ©cifique Ă  chaque architecture et probablement d’ĂȘtre prise en charge par une architecture dans vdso (7).

CLOCK_MONOTONIC_RAW (depuis Linux 2.6.28 ; spécifique à Linux)

Similaire Ă  CLOCK_MONOTONIC , mais fournit un accĂšs direct Ă  un temps matĂ©riel qui n’est pas sujet aux ajustements de frĂ©quence. Cette horloge ne compte pas le temps durant lequel le systĂšme est en veille.

CLOCK_BOOTTIME (depuis Linux 2.6.39 ; spécifique à Linux)

Horloge systĂšme non rĂ©glable identique Ă  CLOCK_MONOTONIC , mais qui prend Ă©galement en compte le temps Ă©coulĂ© pendant la veille du systĂšme. Cela offre aux applications une horloge monotone tenant compte des veilles, sans avoir Ă  s’occuper des problĂšmes de discontinuitĂ©s de CLOCK_REALTIME si l’horloge est mise Ă  jour avec settimeofday (2) ou Ă©quivalent.

CLOCK_BOOTTIME_ALARM (depuis Linux 3.0 ; spécifique à Linux)

Comme CLOCK_BOOTTIME . Voir timer_create (2) pour plus de détails.

CLOCK_PROCESS_CPUTIME_ID (depuis Linux 2.6.12)

Il s’agit d’une horloge qui mesure le temps de processeur consommĂ© par ce processus (Ă  savoir le temps de processeur consommĂ© par tous les threads du processus). Sur Linux, cette horloge n’est pas rĂ©glable.

CLOCK_THREAD_CPUTIME_ID (depuis Linux 2.6.12)

Il s’agit d’une horloge qui mesure le temps de processeur consommĂ© par ce thread. Sur Linux, cette horloge n’est pas rĂ©glable.

Linux implĂ©mente aussi des instances d’horloge dynamique comme dĂ©crit ci-dessous.

Horloges dynamiques

Outre les ID d’horloge Ă  la maniĂšre System-V codĂ©s en dur dĂ©crits ci-dessus, Linux prend Ă©galement en charge des opĂ©rations d’horloge POSIX sur certains fichiers de pĂ©riphĂ©riques. De tels pĂ©riphĂ©riques s’appellent des « horloges dynamiques » et ils sont gĂ©rĂ©s depuis Linux 2.6.39.

Avec les macros adĂ©quates, les descripteurs de fichier ouvert peuvent ĂȘtre convertis en ID d’horloge et passĂ©s Ă  clock_gettime (), clock_settime () et clock_adjtime (2). L’exemple suivant montre la maniĂšre de convertir un descripteur de fichier en ID d’horloge dynamique.

#define CLOCKFD 3
#define FD_TO_CLOCKID(fd) ((~(clockid_t) (fd) << 3) | CLOCKFD)
#define CLOCKID_TO_FD(clk) ((unsigned int) ~((clk) >> 3))
struct timespec ts;
clockid_t clkid;
int fd;
fd = open("/dev/ptp0", O_RDWR);
clkid = FD_TO_CLOCKID(fd);
clock_gettime(clkid, &ts);

VALEUR RENVOYÉE

clock_gettime (), clock_settime () et clock_getres () renvoient 0 si elles rĂ©ussissent. Si elles Ă©chouent, -1 est renvoyĂ© et errno est positionnĂ© pour indiquer l’erreur.

ERREURS

EACCES

clock_settime () n’a pas les droits d’écriture sur l’horloge POSIX dynamique spĂ©cifiĂ©e.

EFAULT

tp pointe en dehors de l’espace d’adressage accessible.

EINVAL

Le clockid indiquĂ© n’est pas valable pour une ou plusieurs raisons. Soit la valeur positive codĂ©e en dur Ă  la maniĂšre de System-V est en dehors de l’intervalle, soit l’ID de l’horloge dynamique ne renvoie pas Ă  une instance valable d’horloge.

EINVAL

( clock_settime ()) : tp.tv_sec est négatif ou tp.tv_nsec dépasse la plage [0..999 999 999].

EINVAL

La clockid indiquĂ©e dans un appel Ă  clock_settime () n’est pas une horloge rĂ©glable.

EINVAL (depuis Linux 4.3)

Un appel Ă  clock_settime () avec un clockid de CLOCK_REALTIME a essayĂ© de positionner l’heure sur une valeur infĂ©rieure Ă  celle actuelle de l’horloge CLOCK_MONOTONIC .

ENODEV

Le périphérique connectable à chaud (comme USB par exemple) représenté par un clk_id dynamique a disparu aprÚs que son fichier de périphérique a été ouvert.

ENOTSUP

L’opĂ©ration n’est pas prise en charge par l’horloge POSIX dynamique indiquĂ©e.

EOVERFLOW

L’horodatage ne pouvait pas tenir dans la plage de time_t . Cela se produit si un exĂ©cutable avec time_t en 32 bits est exĂ©cutĂ© sur un noyau 64 bits quand le jour et l’heure sont 03:14:08 UTC le 19 janvier 2038 ou aprĂšs. NĂ©anmoins, quand l’horloge systĂšme est en dehors de la plage de time_t dans d’autres situation, le comportement n’est pas dĂ©fini.

EPERM

clock_settime () n’a pas l’autorisation de configurer l’horloge spĂ©cifiĂ©e.

ATTRIBUTS

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

Image grohtml-3855064-1.png

VERSIONS

POSIX.1 spécifie ce qui suit :

Configurer la valeur de l’horloge CLOCK_REALTIME avec clock_settime (2) ne doit avoir d’effet ni sur les threads bloquĂ©s attendant un service de temps relatif basĂ© sur cette horloge, y compris la fonction nanosleep () ; ni sur l’expiration des compteurs relatifs basĂ©s sur cette horloge. En consĂ©quence, ces services de temps doivent expirer lorsque la durĂ©e relative demandĂ©e est atteinte, indĂ©pendamment de l’ancienne ou la nouvelle valeur de l’horloge.

Selon POSIX.1-2001, un processus avec des « privilĂšges adĂ©quats » peut changer les horloges CLOCK_PROCESS_CPUTIME_ID et CLOCK_THREAD_CPUTIME_ID avec clock_settime (). Sous Linux, ces horloges ne peuvent pas ĂȘtre modifiĂ©es (c’est-Ă -dire qu’aucun processus n’a de « privilĂšges adĂ©quats »).

Différences entre bibliothÚque C et noyau

Sur certaines architectures; une implémentation de clock_gettime () est fournie dans le vdso (7).

STANDARDS

POSIX.1-2008.

HISTORIQUE

POSIX.1-2001, SUSv2. Linux 2.6.

Sur les systÚmes conformes à la spécification POSIX sur lesquels ces fonctions sont disponibles, la constante symbolique _POSIX_TIMERS est définie dans <unistd.h> comme étant une valeur supérieure à 0 . POSIX.1-2008 rend ces fonctions obligatoires.

Les constantes symboliques _POSIX_MONOTONIC_CLOCK , _POSIX_CPUTIME , _POSIX_THREAD_CPUTIME indiquent que CLOCK_MONOTONIC , CLOCK_PROCESS_CPUTIME_ID , CLOCK_THREAD_CPUTIME_ID sont disponibles. (Consultez aussi sysconf (3).)

Note historique pour les systĂšmes multiprocesseurs (SMP)

Avant la prise en charge par le noyau Linux de CLOCK_PROCESS_CPUTIME_ID et CLOCK_THREAD_CPUTIME_ID , la glibc a mis en Ɠuvre ces horloges sur bien des plate-formes en utilisant les registres temporisateurs des CPU (TSC sur i386, AR.ITC sur Itanium). Les registres peuvent ĂȘtre diffĂ©rents entre les CPU avec pour consĂ©quence des rĂ©sultats bidons pour ces horloges si un processus a Ă©tĂ© transfĂ©rĂ© sur un autre CPU.

Si les CPU d’un systĂšme multiprocesseur ont diffĂ©rentes sources d’horloges, il n’y a aucun moyen de maintenir une corrĂ©lation entre les registres temporisateurs puisque chaque CPU tournera Ă  une frĂ©quence lĂ©gĂšrement diffĂ©rente. Si c’est le cas, clock_getcpuclockid(0) renverra ENOENT pour signifier cette condition. Les deux horloges seront donc utiles si on peut ĂȘtre certain que le processus reste sur un CPU en particulier.

Les processeurs d’un systĂšme multiprocesseur ne dĂ©marrent pas exactement au mĂȘme moment, ainsi les registres temporisateurs sont lancĂ©s avec un dĂ©calage. Certaines architectures incluent un code pour tenter de limiter ce dĂ©calage au dĂ©marrage. Toutefois, ce code ne garantit pas l’accord prĂ©cis des dĂ©calages. La glibc ne contient rien pour gĂ©rer ces dĂ©calages (Ă  la diffĂ©rence du noyau Linux). Typiquement, ces dĂ©calages sont petits et ainsi, leurs effets peuvent ĂȘtre nĂ©gligeables dans la plupart des cas.

Depuis la glibc 2.4, les fonctions qui encapsulent les appels systĂšme dĂ©crits dans cette page permettent d’éviter les problĂšmes mentionnĂ©s ci-dessus en utilisant les horloges CLOCK_PROCESS_CPUTIME_ID et CLOCK_THREAD_CPUTIME_ID du noyau, lorsque celles-ci sont disponibles (c’est-Ă -dire les versions de Linux 2.6.12 et ultĂ©rieures).

EXEMPLES

Le programme ci-dessous montre l’utilisation de clock_gettime () et de clock_getres () avec diffĂ©rentes horloges. Il s’agit d’un exemple de ce qu’on pourrait voir en lançant le programme :

$ ./clock_times x
CLOCK_REALTIME : 1585985459.446 (18356 days + 7h 30m 59s)
résolution : 0.000000001
CLOCK_TAI : 1585985496.447 (18356 days + 7h 31m 36s)
résolution : 0.000000001
CLOCK_MONOTONIC : 52395.722 (14h 33m 15s)
résolution : 0.000000001
CLOCK_BOOTTIME : 72691.019 (20h 11m 31s)
résolution : 0.000000001

Source du programme

/* clock_times.c
Sous licence GNU General Public v2 ou postérieure.
*/
#define _XOPEN_SOURCE 600
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SECS_IN_DAY (24 * 60 * 60)
static void
displayClock(clockid_t clock, const char *name, bool showRes)
{
long days;
struct timespec ts;
if (clock_gettime(clock, &ts) == -1) {
perror("clock_gettime");
exit(EXIT_FAILURE);
}
printf("%-15s: %10jd.%03ld (", name,
(intmax_t) ts.tv_sec, ts.tv_nsec / 1000000);
days = ts.tv_sec / SECS_IN_DAY;
if (days > 0)
printf("%ld days + ", days);
printf("%2dh %2dm %2ds",
(int) (ts.tv_sec % SECS_IN_DAY) / 3600,
(int) (ts.tv_sec % 3600) / 60,
(int) ts.tv_sec % 60);
printf(")\n");
if (clock_getres(clock, &ts) == -1) {
perror("clock_getres");
exit(EXIT_FAILURE);
}
if (showRes)
printf(" résolution : %10jd.%09ld\n",
(intmax_t) ts.tv_sec, ts.tv_nsec);
}
int
main(int argc, char *argv[])
{
bool showRes = argc > 1;
displayClock(CLOCK_REALTIME, "CLOCK_REALTIME", showRes);
#ifdef CLOCK_TAI
displayClock(CLOCK_TAI, "CLOCK_TAI", showRes);
#endif
displayClock(CLOCK_MONOTONIC, "CLOCK_MONOTONIC", showRes);
#ifdef CLOCK_BOOTTIME
displayClock(CLOCK_BOOTTIME, "CLOCK_BOOTTIME", showRes);
#endif
exit(EXIT_SUCCESS);
}

VOIR AUSSI

date (1), gettimeofday (2), settimeofday (2), time (2), adjtime (3), clock_getcpuclockid (3), ctime (3), ftime (3), pthread_getcpuclockid (3), sysconf (3), timespec (3), time (7), time_namespaces (7), vdso (7), hwclock (8)

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> et Jean-Philippe MENGUAL <jpmengual@debian.org>

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 .