2010-06-02 16 views
27

Estoy buscando un equivalente a GetTickCount() en Linux.Equivalente a GetTickCount() en Linux

Actualmente estoy usando Python's time.time() que presumiblemente llama a gettimeofday(). Mi preocupación es que el tiempo regresó (la época de Unix), puede cambiar de forma errática si se altera el reloj, como por ejemplo el NTP. Un proceso simple o tiempo de pared del sistema, que solo aumenta positivamente a una velocidad constante, sería suficiente.

¿Existe alguna función de ese tiempo en C o Python?

+0

relacionado: [¿Cómo puedo obtener duraciones de tiempo monótonas en python?] (Http://stackoverflow.com/q/1205722/4279) – jfs

Respuesta

26

Puedes usar CLOCK_MONOTONIC p. Ej. en C:

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

Ver esta pregunta para una forma de Python - How do I get monotonic time durations in python?

+0

Brillante. Gracias por el enlace también. –

+1

Y en sistemas Linux muy antiguos, puede usar/proc/uptime como fuente de tiempo monotónica. Clunky pero funciona. –

+4

Hay una nota en la página de manual: 'CLOCK_MONOTONIC_RAW' (desde Linux 2.6.28; específica de Linux) Similar a' CLOCK_MONOTONIC', pero proporciona acceso a un hardware en bruto basado en tiempo de hardware que no está sujeto a ajustes de NTP. ¿Esto significa que 'CLOCK_MONOTONIC_RAW' es más apropiado? –

1

Sí, el núcleo tiene temporizadores de alta resolución, pero es diferente. Le recomendaría que consulte las fuentes de cualquier proyecto impar que lo envuelva de manera portátil.

De C/C++ usualmente #ifdef esto y uso gettimeofday() en Linux, lo que me da una resolución de microsegundos. A menudo agrego esto como una fracción a los segundos desde la época en que también recibo darme un doble.

4

Deberá utilizar: clock_gettime(CLOCK_MONOTONIC, &tp);. Esta llamada no se ve afectada por el ajuste del tiempo del sistema como GetTickCount() en Windows.

5

Esto parece funcionar:

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

sí, get_tick() es la columna vertebral de mis aplicaciones. que consta de una máquina de estado para cada 'tarea' por ejemplo, puede realizar múltiples tareas sin utilizar subprocesos y comunicación entre procesos Puede implementar retrasos sin bloqueo.

Cuestiones relacionadas