linux real-time

linux - Punto de partida para CLOCK_MONOTONIC



real-time (3)

Como entiendo en el punto de inicio de Linux para CLOCK_MONOTONIC es el tiempo de arranque. En mi trabajo actual, prefiero usar el reloj monotónico en lugar de CLOCK_REALTIME (para el cálculo), pero al mismo tiempo necesito proporcionar marcas de tiempo amigables para el hombre (con año / mes / día) en los informes. Pueden no ser muy precisos, así que estaba pensando en unirme al contador monotónico con el tiempo de arranque.

¿Desde dónde puedo obtener este tiempo en el sistema de linux usando llamadas a la API?


Suponiendo que el kernel de Linux inicie el contador de tiempo de actividad al mismo tiempo que inicia el seguimiento del reloj monotónico, puede derivar el tiempo de arranque (relativo a la época) restando el tiempo de actividad de la hora actual .

Linux ofrece el tiempo de actividad del sistema en segundos a través de la estructura sysinfo ; la hora actual en segundos desde que la Época se puede adquirir en bibliotecas compatibles con POSIX a través de la función de time .

#include <stddef.h> #include <stdio.h> #include <time.h> #include <sys/sysinfo.h> int main(void){ /* get uptime in seconds */ struct sysinfo info; sysinfo(&info); /* calculate boot time in seconds since the Epoch */ const time_t boottime = time(NULL) - info.uptime; /* get monotonic clock time */ struct timespec monotime; clock_gettime(CLOCK_MONOTONIC, &monotime); /* calculate current time in seconds since the Epoch */ time_t curtime = boottime + monotime.tv_sec; /* get realtime clock time for comparison */ struct timespec realtime; clock_gettime(CLOCK_REALTIME, &realtime); printf("Boot time = %s", ctime(&boottime)); printf("Current time = %s", ctime(&curtime)); printf("Real Time = %s", ctime(&realtime.tv_sec)); return 0; }

Desafortunadamente, es posible que el reloj monotónico no coincida exactamente con el tiempo de arranque. Cuando probé el código anterior en mi máquina, el reloj monotónico estaba a un segundo del tiempo de actividad del sistema. Sin embargo, puede seguir utilizando el reloj monotónico siempre que tenga en cuenta el desplazamiento respectivo.

Nota de portabilidad : aunque Linux puede devolver el tiempo monótono actual en relación con el tiempo de arranque, las máquinas POSIX en general tienen permitido devolver el tiempo monótono actual desde cualquier punto en el tiempo arbitrario (aunque consistente) (a menudo la época).

Como nota al margen, es posible que no necesite derivar el tiempo de arranque como lo hice yo. Sospecho que hay una manera de obtener el tiempo de arranque a través de la API de Linux, ya que hay muchas utilidades de Linux que muestran el tiempo de arranque en un formato legible por el ser humano. Por ejemplo:

$ who -b system boot 2013-06-21 12:56

No pude encontrar esa llamada, pero la inspección del código fuente de algunas de estas utilidades comunes puede revelar cómo determinan el tiempo de arranque legible por el ser humano.

En el caso de la utilidad who , sospecho que utiliza el archivo utmp para obtener el tiempo de arranque del sistema.


http://www.kernel.org/doc/man-pages/online/pages/man2/clock_getres.2.html :

CLOCK_MONOTONIC Clock that cannot be set and represents monotonic time since some unspecified starting point.

Significa que puede usar CLOCK_MONOTONIC para cálculos de intervalo y otras cosas, pero realmente no puede convertirlo en una representación legible por humanos.

Además, es posible que desee CLOCK_MONOTONIC_RAW lugar de CLOCK_MONOTONIC :

CLOCK_MONOTONIC_RAW (since Linux 2.6.28; Linux-specific) Similar to CLOCK_MONOTONIC, but provides access to a raw hard‐ ware-based time that is not subject to NTP adjustments.

Continúe usando CLOCK_REALTIME para tiempos legibles por humanos.


CLOCK_MONOTONIC generalmente no se ve afectado por ningún ajuste en la hora del sistema. Por ejemplo, si el reloj del sistema se ajusta a través de NTP, CLOCK_MONOTONIC no tiene forma de saberlo (ni tampoco lo necesita).

Por este motivo, no use CLOCK_MONOTONIC si necesita marcas de tiempo legibles.

¿Ver diferencia entre CLOCK_REALTIME y CLOCK_MONOTONIC? para una discusión.