Начальная точка для CLOCK_MONOTONIC
Как я понимаю на Linux отправная точка для CLOCK_MONOTONIC
время загрузки В своей текущей работе я предпочитаю использовать монотонные часы вместо CLOCK_REALTIME
(для расчета), но в то же время мне нужно предоставить удобные для человека временные метки (с указанием года / месяца / дня) в отчете. Они могут быть не очень точными, поэтому я подумывал объединить монотонный счетчик со временем загрузки.
Откуда я могу получить это время в системе Linux, используя вызовы API?
3 ответа
Предполагая, что ядро Linux запускает счетчик времени работы в то же время, когда оно начинает отслеживать монотонные часы, вы можете получить время загрузки (относительно эпохи), вычитая время работы из текущего времени.
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 в целом разрешается возвращать текущее монотонное время с любого произвольного - но согласованного - момента времени (часто эпохи).
Как примечание, вам, возможно, не нужно определять время загрузки, как я. Я подозреваю, что есть способ получить время загрузки через Linux API, поскольку есть много утилит Linux, которые отображают время загрузки в удобочитаемом формате. Например:
$ who -b
system boot 2013-06-21 12:56
Я не смог найти такой вызов, но проверка исходного кода некоторых из этих распространенных утилит может показать, как они определяют удобочитаемое время загрузки.
В случае с who
утилита, я подозреваю, что он использует utmp
файл для получения времени загрузки системы.
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
для удобочитаемых времен.
CLOCK_MONOTONIC
Как правило, на него не влияют какие-либо корректировки системного времени. Например, если системные часы настроены через NTP, CLOCK_MONOTONIC
не имеет возможности узнать (и не нужно).
По этой причине не используйте CLOCK_MONOTONIC
если вам нужны удобочитаемые метки времени.
Видите разницу между CLOCK_REALTIME и CLOCK_MONOTONIC? для обсуждения.