2010-06-02 6 views
27

Je suis à la recherche d'un équivalent à GetTickCount() sur Linux.Equivalent à GetTickCount() sous Linux

Actuellement j'utilise le time.time() de Python qui appelle vraisemblablement à gettimeofday(). Ma préoccupation est que le temps retourné (l'époque unix), peut changer de façon erratique si l'horloge est foiré, comme par le NTP. Un simple processus ou temps de paroi du système, qui ne croît positivement qu'à un rythme constant, suffirait.

Une telle fonction de temps existe-t-elle en C ou en Python?

+0

related: [Comment puis-je obtenir des durées de temps monotones en python?] (Http://stackoverflow.com/q/1205722/4279) – jfs

Répondre

26

Vous pouvez utiliser CLOCK_MONOTONIC par exemple. en C:

struct timespec ts; 
if(clock_gettime(CLOCK_MONOTONIC,&ts) != 0) { 
//error 
} 

Voir cette question d'une manière Python - How do I get monotonic time durations in python?

+0

Brilliant. Merci pour le lien aussi. –

+1

Et sur les systèmes Linux très anciens, vous pouvez utiliser/proc/uptime comme source de temps monotone. Clunky mais fonctionne. –

+4

Il y a une note sur la page de manuel: 'CLOCK_MONOTONIC_RAW' (depuis Linux 2.6.28, spécifique à Linux) Similaire à' CLOCK_MONOTONIC', mais donne accès à un temps dur à base d'articles non soumis à des ajustements NTP. Cela signifie-t-il que CLOCK_MONOTONIC_RAW est plus approprié? –

1

Oui, le noyau dispose de minuteries haute résolution mais c'est différent. Je vous recommande de regarder les sources de tout projet étrange qui enveloppe ce d'une manière portable. De C/C++ J'ai l'habitude #ifdef cela et utilise gettimeofday() sur Linux qui me donne la résolution de microsecondes. J'ajoute souvent cela comme une fraction de seconde depuis l'époque où je reçois aussi un double.

4

Vous devez utiliser: clock_gettime(CLOCK_MONOTONIC, &tp);. Cet appel n'est pas affecté par l'ajustement de l'heure système tout comme GetTickCount() sur Windows.

5

Cela semble fonctionner:

#include <unistd.h> 
#include <time.h> 

uint32_t getTick() { 
    struct timespec ts; 
    unsigned theTick = 0U; 
    clock_gettime(CLOCK_REALTIME, &ts); 
    theTick = ts.tv_nsec/1000000; 
    theTick += ts.tv_sec * 1000; 
    return theTick; 
} 

oui, get_tick() est l'épine dorsale de mes applications. Composé d'une machine d'état pour chaque 'tâche' Par exemple, une tâche multitâche peut-elle utiliser des unités d'exécution et Inter Process Communication Peut implémenter des délais non bloquants.