2010-06-02 13 views
27

Ich suche ein Äquivalent zu GetTickCount() auf Linux.Entspricht GetTickCount() auf Linux

Momentan verwende ich Python time.time(), die vermutlich durch gettimeofday() ruft. Meine Sorge ist, dass die zurückgegebene Zeit (die Unix-Epoche) sich unregelmäßig ändern kann, wenn die Uhr gestört wird, beispielsweise durch NTP. Eine einfache Prozess- oder Systemwandzeit, die nur bei konstanter Rate positiv ansteigt, würde ausreichen.

Ist eine solche Zeitfunktion in C oder Python existieren?

+0

bezogen werden: [? Wie kann ich monotonen Zeitdauern in Python zu bekommen] (http://stackoverflow.com/q/1205722/4279) – jfs

Antwort

26

können Sie verwenden CLOCK_MONOTONIC z.B. in C:

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

Sehen Sie diese Frage für eine Python Art und Weise - How do I get monotonic time durations in python?

+0

Brilliant. Danke für den Link auch. –

+1

Und auf sehr alten Linux-Systemen können Sie/proc/uptime als monotone Zeitquelle verwenden. Clunky aber funktioniert. –

+4

Es gibt einen Hinweis auf der Hilfeseite: 'CLOCK_MONOTONIC_RAW' (seit Linux 2.6.28; Linux-spezifisch) Ähnlich wie' CLOCK_MONOTONIC', aber bietet Zugriff auf eine rohe hardware-basierte Zeit , die NTP-Anpassungen nicht unterliegt. Bedeutet dies, dass CLOCK_MONOTONIC_RAW geeigneter ist? –

1

Ja, die Kernel hat hochauflösende Timer, aber es ist anders. Ich würde empfehlen, dass Sie sich die Quellen irgendeines seltsamen Projekts ansehen, das dies in einer tragbaren Weise umschließt.

Von C/C++ ich normalerweise #ifdef dies und verwenden gettimeofday() auf Linux, die mir Mikrosekundenauflösung gibt. Ich füge das oft als Bruchteil zu den Sekunden hinzu, seit der Epoche, in der ich auch ein Double bekomme.

4

Sie verwenden sollten: clock_gettime(CLOCK_MONOTONIC, &tp);. Dieser Aufruf wird nicht von der Anpassung der Systemzeit wie GetTickCount() unter Windows beeinflusst.

5

Dies scheint zu funktionieren:

#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; 
} 

ja, get_tick() Ist das Rückgrat meiner Anwendungen. Bestehend aus einer Zustandsmaschine für jede ‚Task‘ zB kann Communication Threads und Inter-Prozess ohne Verwendung Kann implementieren nicht blockierende Verzögerungen Multi-Task.