Entspricht GetTickCount() unter Linux

Lesezeit: 2 Minuten

Benutzer-Avatar
Matt Tischler

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

Derzeit verwende ich Python’s time.time() die vermutlich anruft gettimeofday(). Meine Sorge ist, dass sich die zurückgegebene Zeit (die Unix-Epoche) unregelmäßig ändern kann, wenn die Uhr durcheinander gebracht wird, z. B. durch NTP. Eine einfache Prozess- oder Systemwandzeit, die nur mit einer konstanten Rate positiv zunimmt, würde ausreichen.

Gibt es eine solche Zeitfunktion in C oder Python?

  • verwandt: Wie bekomme ich monotone Zeitdauern in Python?

    – jfs

    18. Januar 2015 um 10:59 Uhr

Benutzer-Avatar
Nr

Sie können verwenden CLOCK_MONOTONISCH zB in C:

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

Siehe diese Frage für einen Python-Weg – Wie bekomme ich monotone Zeitdauern in Python?

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

    – Zan Luchs

    3. Juni 2010 um 21:37 Uhr

  • Es gibt einen Hinweis auf der Manpage: CLOCK_MONOTONIC_RAW (seit Linux 2.6.28; Linux-spezifisch) Ähnlich wie CLOCK_MONOTONIC, bietet aber Zugriff auf eine hardwarebasierte Rohzeit, die keinen NTP-Anpassungen unterliegt. Bedeutet dies das CLOCK_MONOTONIC_RAW ist angemessener?

    – Matt Tischler

    4. Juni 2010 um 4:20 Uhr


  • @MattJoiner: Wann CLOCK_MONOTONIC_RAW spricht über NTP-Anpassungen, es bezieht sich auf die Bewertung der Uhr und nicht den absoluten Wert. CLOCK_MONOTONIC wird nicht übersprungen (wie der Name schon sagt) und ist normalerweise die richtige Wahl.

    – Café

    12. Oktober 2011 um 4:34 Uhr

  • Es könnte sich lohnen, diese Frage zu CLOCK_MONOTONIC zu überprüfen: stackoverflow.com/questions/3657289/…

    – Brett

    23. Juli 2012 um 2:59 Uhr

Benutzer-Avatar
Pinguinpricotman

Das 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 „Aufgabe“, zB Multitasking ohne Verwendung von Threads und Kommunikation zwischen Prozessen. Kann nicht blockierende Verzögerungen implementieren.

Du solltest benutzen: clock_gettime(CLOCK_MONOTONIC, &tp);. Dieser Aufruf ist nicht von der Anpassung der Systemzeit betroffen, genau wie GetTickCount() unter Windows.

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

Von C/C++ habe ich normalerweise #ifdef dies und verwenden gettimeofday() unter Linux, was mir eine Mikrosekundenauflösung gibt. Ich füge dies oft als Bruchteil zu den Sekunden seit der Epoche hinzu, die ich auch erhalte, was mir ein Doppel gibt.

1382540cookie-checkEntspricht GetTickCount() unter Linux

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy