2009-11-30 4 views
2

Je souhaite connaître l'heure qui s'est écoulée entre l'occurrence de deux événements.Gestion des changements d'heure système

Maintenant, la manière simple serait d'utiliser quelque chose comme:

time_t x, y; 
x = time(NULL); 

/* Some other stuff happens */ 

y = time(NULL); 
printf("Time passed: %i", y-x); 

Cependant, il est possible que le temps du système est changé entre ces deux événements.

Existe-t-il une autre façon de connaître l'heure qui s'est écoulée entre les deux événements? Ou y a-t-il un moyen de détecter les changements dans l'heure du système?

Répondre

5

Puisque vous êtes apparemment sous Linux, vous pouvez utiliser l'horloge CLOCK_MONOTONIC Posix pour obtenir une minuterie qui n'est pas affecté par les changements de temps du système:

struct timespec ts1, ts2; 

clock_gettime(CLOCK_MONOTONIC, &ts1); 
/* Things happen */ 
clock_gettime(CLOCK_MONOTONIC, &ts2); 

ts2.tv_sec -= ts1.tv_sec; 
ts2.tv_nsec -= ts1.tv_nsec; 
if (ts2.tv_nsec < 0) 
{ 
    ts2.tv_nsec += 1000000000L; 
    ts2.tv_sec -= 1; 
} 

printf("Elapsed time: %lld.%09lds\n", (long long)ts2.tv_sec, ts2.tv_nsec); 

Pour vérifier si le système prend en charge CLOCK_MONOTONIC, vérifiez sysconf(_SC_MONOTONIC_CLOCK) > 0.

1

Vous pouvez utiliser clock_gettime() sous Linux ou gethrtime() sur d'autres systèmes Unix. Bien que la différence entre deux de ces valeurs vous donne un intervalle de temps, ces appels ne vous donnent pas des valeurs de temps régulières. Comme le dit HP-UX en ce qui concerne gethrtime():

La fonction gethrtime() renvoie l'heure actuelle en haute résolution. Le temps est exprimé en nanosecondes depuis un certain temps dans le passé.

+0

Si vous utilisez clock_gettime(), vous devez spécifier CLOCK_MONOTONIC - si cette option est prise en charge. L'utilisation de l'option normale - CLOCK_REALTIME - entraînera des inexactitudes si l'horloge système est modifiée. – Dipstick

Questions connexes