web-dev-qa-db-fra.com

Point de départ pour CLOCK_MONOTONIC

Si je comprends bien sur Linux point de départ pour CLOCK_MONOTONIC est le temps de démarrage. Dans mon travail actuel, je préfère utiliser une horloge monotone au lieu de CLOCK_REALTIME (pour le calcul) mais en même temps, je dois fournir des horodatages conviviaux (avec année/mois/jour) dans les rapports. Ils peuvent ne pas être très précis, alors je pensais rejoindre le compteur monotone avec le temps de démarrage.

D'où puis-je obtenir cette fois sur le système Linux en utilisant des appels API?

18
rimas

En supposant que le noyau Linux démarre le compteur uptime en même temps qu'il commence à suivre l'horloge monotone, vous pouvez dériver l'heure de démarrage (par rapport à l'époque) en soustrayant disponibilité à partir de heure actuelle .

Linux offre le système uptime en quelques secondes via la structure sysinfo ; heure actuelle en secondes car l'Epoch peut être acquise sur des bibliothèques compatibles POSIX via la fonction time .

#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <sys/sysinfo.h>

int main(void){
    /* get uptime in seconds */
    struct sysinfo info;
    sysinfo(&info);

    /* calculate boot time in seconds since the Epoch */
    const time_t boottime = time(NULL) - info.uptime;

    /* get monotonic clock time */
    struct timespec monotime;
    clock_gettime(CLOCK_MONOTONIC, &monotime);

    /* calculate current time in seconds since the Epoch */
    time_t curtime = boottime + monotime.tv_sec;

    /* get realtime clock time for comparison */
    struct timespec realtime;
    clock_gettime(CLOCK_REALTIME, &realtime);

    printf("Boot time = %s", ctime(&boottime));
    printf("Current time = %s", ctime(&curtime));
    printf("Real Time = %s", ctime(&realtime.tv_sec));

    return 0;
}

Malheureusement, l'horloge monotone peut ne pas correspondre exactement au temps de démarrage. Lorsque j'ai testé le code ci-dessus sur ma machine, l'horloge monotone était à une seconde de la disponibilité du système. Cependant, vous pouvez toujours utiliser l'horloge monotone tant que vous tenez compte du décalage respectif.

Note de portabilité: bien que Linux puisse renvoyer l'heure monotone actuelle par rapport à l'heure de démarrage, les machines POSIX en général sont autorisés à renvoyer le temps monotone actuel à partir de n'importe quel point dans le temps arbitraire - mais cohérent (souvent l'époque).


En remarque, vous n'aurez peut-être pas besoin de dériver le temps de démarrage comme je l'ai fait. Je soupçonne qu'il existe un moyen d'obtenir l'heure de démarrage via l'API Linux, car il existe de nombreux utilitaires Linux qui affichent l'heure de démarrage dans un format lisible par l'homme. Par exemple:

$ who -b
         system boot  2013-06-21 12:56

Je n'ai pas pu trouver un tel appel, mais l'inspection du code source de certains de ces utilitaires courants peut révéler comment ils déterminent le temps de démarrage lisible par l'homme.

Dans le cas de l'utilitaire who, je soupçonne qu'il utilise le fichier utmp pour acquérir le temps de démarrage du système.

11
Vilhelm Gray

http://www.kernel.org/doc/man-pages/online/pages/man2/clock_getres.2.html :

  CLOCK_MONOTONIC
          Clock that cannot be set and represents monotonic time since some
          unspecified starting point.

Signifie que vous pouvez utiliser CLOCK_MONOTONIC pour les calculs d'intervalle et d'autres choses, mais vous ne pouvez pas vraiment le convertir en une représentation lisible par l'homme.

De plus, vous voulez probablement CLOCK_MONOTONIC_RAW au lieu de CLOCK_MONOTONIC:

  CLOCK_MONOTONIC_RAW (since Linux 2.6.28; Linux-specific)
          Similar  to  CLOCK_MONOTONIC, but provides access to a raw hard‐
          ware-based time that is not subject to NTP adjustments.

Continue à utiliser CLOCK_REALTIME pour des temps lisibles par l'homme.

3
Maxim Egorushkin

CLOCK_MONOTONIC n'est généralement affecté par aucun ajustement de l'heure système. Par exemple, si l'horloge système est ajustée via NTP, CLOCK_MONOTONIC n'a aucun moyen de le savoir (ni n'en a besoin).

Pour cette raison, n'utilisez pas CLOCK_MONOTONIC si vous avez besoin d'horodatages lisibles par l'homme.

Voir Différence entre CLOCK_REALTIME et CLOCK_MONOTONIC? pour une discussion.

0
NPE