2015-03-03 3 views
1

Для некоторых функций библиотеки сторонних разработчиков требуется передать мне timespec, который использует абсолютное время, а не относительное время.Абсолютное время с использованием монотонных часов

Для этого у меня есть:

struct timespec ts; 
struct timespec now; 
if (clock_gettime(CLOCK_REALTIME, &now) != 0) 
{ 
    printf("Error: "); 
    printf("%s\n", strerror(errno)); 
} 
tspec_add(&ts, &now, 5000); //ts = now + 5000ms. 

//I pass ts to the library function. 

И функции работают нормально .. Однако, если я использую CLOCK_MONOTONIC или CLOCK_MONOTONIC_RAW он не работает.

Я проверил ошибки (NONE). Успех функции, но время, которое она выводит, совершенно другое и очень малое. Он напечатал 9005 для tv.sec, но при использовании CLOCK_REALTIME он напечатал огромное количество (я предполагаю время с эпохи).

Почему это? Как я могу использовать монотонные часы, чтобы сделать то же самое?

+2

'MONOTONIC' обычно использует инструкцию' rdtsc' для архитектур x86. Временная метка, которую он считывает, - это некоторое количество «тиков», поскольку последний сброс процессора; Частота счетчика обычно равна либо частоте шины, либо самой высокой частоте, которую может достичь процессор. Это значение счетчика с разрешением наносекунд затем преобразуется в 'struct timespec' и выплевывается' clock_gettime() '. Все, что говорит нам 9005 секунд, это то, что вы последний раз перезагружались около 2,5 часов назад; Чтобы преобразовать это в абсолютное время, вам придется добавить это ко времени последней загрузки. –

ответ

3

Как подразумевается в @IwillnotexistIdonotexist, CLOCK_MONOTONIC не имеет заданной начальной точки, и вы не можете надежно преобразовать монотонное время в реальном времени.

Цитирует clock_gettime manpage для CLOCK_MONOTONIC:

Часов, которые не могут быть установлены и представляют монотонное время с некоторого неустановленной отправной точки

Единственным ограничение состоит в том, что монотонные время должно быть больше чем время работы системы (требуется для монотонного увеличения).

Я ожидаю, что большинство реализаций действительно являются часами с момента загрузки, но ничего не гарантирует этого.

Смежные вопросы