Equivalente a GetTickCount() en Linux

2 minutos de lectura

avatar de usuario
carpintero mate

Estoy buscando un equivalente a GetTickCount() en Linux.

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

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

  • relacionado: ¿Cómo obtengo duraciones de tiempo monótonas en python?

    – jfs

    18 de enero de 2015 a las 10:59

avatar de usuario
nos

Puedes usar RELOJ_MONOTÓNICO por ejemplo en C:

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

Consulte esta pregunta para conocer una forma de Python: ¿cómo obtengo duraciones de tiempo monótonas en Python?

  • Y en sistemas Linux muy antiguos, puede usar /proc/uptime como fuente de tiempo monótona. Torpe pero funciona.

    – Zan Lince

    3 de junio de 2010 a las 21:37

  • Hay una nota en la página de manual: CLOCK_MONOTONIC_RAW (desde Linux 2.6.28; específico de Linux) Similar a CLOCK_MONOTONIC, pero brinda acceso a un tiempo sin procesar basado en hardware que no está sujeto a ajustes de NTP. ¿Significa esto que CLOCK_MONOTONIC_RAW es mas apropiado?

    – Matt Carpintero

    4 de junio de 2010 a las 4:20


  • @MattJoiner: Cuando CLOCK_MONOTONIC_RAW habla de ajustes NTP, se refiere a la calificar del reloj en lugar del valor absoluto. CLOCK_MONOTONIC no se saltará (como su nombre lo indica) y suele ser la opción correcta.

    – café

    12 de octubre de 2011 a las 4:34

  • Podría valer la pena revisar esta pregunta sobre CLOCK_MONOTONIC: stackoverflow.com/questions/3657289/…

    – Brett

    23 de julio de 2012 a las 2:59

avatar de usuario
pinguinoapricotman

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. Consta de una máquina de estado para cada ‘tarea’, por ejemplo, puede realizar múltiples tareas sin usar subprocesos y comunicación entre procesos. Puede implementar retrasos sin bloqueo.

Deberías usar: clock_gettime(CLOCK_MONOTONIC, &tp);. Esta llamada no se ve afectada por el ajuste de la hora del sistema al igual que GetTickCount() en Windows.

Sí, el núcleo tiene temporizadores de alta resolución, pero es diferente. Recomendaría que consulte las fuentes de cualquier proyecto extraño que envuelva esto de manera portátil.

Desde C/C++ normalmente #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, lo que me da un doble.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad