Работа с изменениями системного времени - PullRequest
2 голосов
/ 30 ноября 2009

Я хочу знать, сколько времени прошло между возникновением двух событий.

Теперь простым способом было бы использовать что-то вроде:

time_t x, y;
x = time(NULL);

/* Some other stuff happens */

y = time(NULL);
printf("Time passed: %i", y-x);

Однако, возможно, что системное время изменяется между этими двумя событиями.

Есть ли альтернативный способ узнать время, прошедшее между двумя событиями? Или есть способ обнаружить изменения системного времени?

Ответы [ 2 ]

6 голосов
/ 30 ноября 2009

Поскольку вы, очевидно, работаете в Linux, вы можете использовать часы POSIX CLOCK_MONOTONIC, чтобы получить таймер, который не зависит от изменений системного времени:

struct timespec ts1, ts2;

clock_gettime(CLOCK_MONOTONIC, &ts1);
/* Things happen */
clock_gettime(CLOCK_MONOTONIC, &ts2);

ts2.tv_sec -= ts1.tv_sec;
ts2.tv_nsec -= ts1.tv_nsec;
if (ts2.tv_nsec < 0)
{
    ts2.tv_nsec += 1000000000L;
    ts2.tv_sec -= 1;
}

printf("Elapsed time: %lld.%09lds\n", (long long)ts2.tv_sec, ts2.tv_nsec);

Чтобы проверить, поддерживает ли система CLOCK_MONOTONIC, проверьте sysconf(_SC_MONOTONIC_CLOCK) > 0.

1 голос
/ 30 ноября 2009

Вы можете использовать clock_gettime () в Linux или gethrtime () в некоторых других системах Unix. Хотя разница между двумя такими значениями дает вам временной интервал, эти вызовы не дают вам регулярные значения времени. Как говорит HP-UX относительно gethrtime ():

Функция gethrtime () возвращает текущее высокое разрешение в реальном времени. Время выражается в наносекундах с определенного времени в прошлом.

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