Начальная точка для CLOCK_MONOTONIC

Как я понимаю, отправной точкой Linux для CLOCK_MONOTONIC является время загрузки. В моей текущей работе я предпочитаю использовать монотонные часы вместо CLOCK_REALTIME (для расчета), но в то же время мне нужно предоставить человеческие дружеские отметки времени (с указанием года/месяца/дня) в отчетах. Они могут быть не очень точными, поэтому я решил присоединиться к монотонному счетчику с временем загрузки.

Откуда я могу получить это время на linux-системе, используя вызовы api?

Ответ 1

Предполагая, что ядро ​​Linux запускает счетчик времени безотказной работы одновременно с началом отслеживания монотонных часов, вы можете получить время загрузки (относительно Epoch), вычитая время безотказной работы из текущее время.

Linux предлагает время безотказной работы системы через секунды через структуру sysinfo; текущее время в секундах с момента, когда Epoch может быть приобретено в POSIX-совместимых библиотеках через функцию 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;
}

К сожалению, монотонные часы могут не соответствовать точному времени загрузки. Когда я тестировал вышеприведенный код на своей машине, монотонные часы были секундой от времени безотказной работы системы. Тем не менее, вы все равно можете использовать монотонные часы до тех пор, пока вы учитываете соответствующее смещение.

Заметка о переносимости: хотя Linux может возвращать текущее монотонное время относительно времени загрузки, POSIX-машинам в целом разрешено возвращать текущее монотонное время из любого произвольного, но согласованного момента времени (часто Эпоха).


В качестве дополнительной заметки вам может не потребоваться время загрузки, как и я. Я подозреваю, что есть способ получить время загрузки через API Linux, так как есть много утилит Linux, которые отображают время загрузки в удобном для восприятия формате. Например:

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

Мне не удалось найти такой вызов, но проверка исходного кода для некоторых из этих общих утилит может показать, как они определяют время загрузки для человека.

В случае утилиты who, я подозреваю, что она использует файл utmp для получения времени загрузки системы.

Ответ 2

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.

Значит, вы можете использовать CLOCK_MONOTONIC для интервальных вычислений и других вещей, но вы не можете преобразовать его в читаемое человеком представление.

Кроме того, вы нуждаетесь в CLOCK_MONOTONIC_RAW вместо 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.

Продолжайте использовать CLOCK_REALTIME для чтения человеком.

Ответ 3

CLOCK_MONOTONIC обычно не зависит от каких-либо корректировок системного времени. Например, если системные часы настраиваются с помощью NTP, CLOCK_MONOTONIC не имеет возможности знать (и не нужно).

По этой причине не используйте CLOCK_MONOTONIC, если вам нужны человекообразные отметки времени.

См. Разницу между CLOCK_REALTIME и CLOCK_MONOTONIC? для обсуждения.