CLOCK_REALTIME
est affecté par NTP et peut avancer et reculer. CLOCK_MONOTONIC
ne l'est pas et avance d'un tick par tick.
Le livre de Robert Love LINUX System Programming 2nd Edition , répond spécifiquement à votre question au début du chapitre 11, pg 363 :
L'aspect important d'une source de temps monotone n'est PAS la valeur actuelle, mais la garantie que la source de temps augmente strictement linéairement, et donc utile pour calculer la différence de temps entre deux échantillonnages
Cela dit, je pense qu'il suppose que les processus s'exécutent sur la même instance d'un système d'exploitation. Vous souhaiterez donc peut-être exécuter un étalonnage périodique pour pouvoir estimer la dérive.
CLOCK_REALTIME
représente la meilleure estimation de la machine quant à l'heure actuelle de l'horloge murale et de l'heure du jour. Comme le disent Ignacio et MarkR, cela signifie que CLOCK_REALTIME
peut sauter en avant et en arrière lorsque l'horloge système est modifiée, y compris par NTP.
CLOCK_MONOTONIC
représente le temps absolu écoulé depuis un point fixe arbitraire dans le passé. Il n'est pas affecté par les modifications de l'horloge système.
Si vous souhaitez calculer le temps écoulé entre deux événements observés sur la même machine sans redémarrage intermédiaire, CLOCK_MONOTONIC
est la meilleure option.
Notez que sous Linux, CLOCK_MONOTONIC
ne mesure pas le temps passé en suspension, bien que selon la définition POSIX, il le devrait. Vous pouvez utiliser le CLOCK_BOOTTIME
spécifique à Linux pour une horloge monotone qui continue de fonctionner pendant la suspension.
Citations POSIX 7
POSIX 7 spécifie les deux sur http://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html :
CLOCK_REALTIME
:
Cette horloge représente l'horloge mesurant le temps réel pour le système. Pour cette horloge, les valeurs renvoyées par clock_gettime() et spécifiées par clock_settime() représentent la durée (en secondes et nanosecondes) depuis l'Epoch.
CLOCK_MONOTONIC
(fonction facultative) :
Pour cette horloge, la valeur renvoyée par clock_gettime() représente la durée (en secondes et nanosecondes) depuis un point non spécifié dans le passé (par exemple, l'heure de démarrage du système ou l'époque). Ce point ne change pas après le démarrage du système. La valeur de l'horloge CLOCK_MONOTONIC ne peut pas être définie via clock_settime().
clock_settime()
donne un indice important :les systèmes POSIX sont capables de modifier arbitrairement CLOCK_REALITME
avec lui, alors ne vous fiez pas à ce qu'il coule ni en continu ni en avant. NTP pourrait être implémenté en utilisant clock_settime()
, et ne peut affecter que CLOCK_REALTIME
.
L'implémentation du noyau Linux semble prendre le temps de démarrage comme époque pour CLOCK_MONOTONIC
:Point de départ pour CLOCK_MONOTONIC