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