Программирование в стандарте POSIX


Опрос и установка показаний часов реального времени - часть 4


Часы могут быть общесистемными, т. е. видимыми для всех процессов, или принадлежащими процессу (измеряют время, имеющее смысл только для конкретного процесса). Все реализации должны поддерживать общесистемные часы реального времени, измеряющие время от начала отсчета и имеющие идентификатор CLOCK_REALTIME. Интерпретация показаний других часов (если таковые имеются) стандартом не специфицируется.

Установка новых показаний для часов CLOCK_REALTIME влияет на срабатывание таймеров, взведенных на абсолютное время, но не затрагивает интервальные таймеры.

Если в системе поддерживаются монотонные часы (с идентификатором CLOCK_MONOTONIC), они измеряют время от некоторого неспецифицированного момента в прошлом (например, от загрузки системы или начала отсчета). Монотонные часы предназначены для измерения относительного времени. По определению, их показания нельзя установить с помощью функции clock_settime().

Применение описанных выше функций иллюстрируется программой, показанной в листинге 12.6. Возможно, при редактировании ее внешних связей придется указать дополнительные библиотеки (например, -lrt), что является следствием использования необязательных компонентов стандарта POSIX.

#include <stdio.h> #include <time.h> #include <sys/time.h>

int main (void) { struct timespec tmsp; struct timeval tmvl; time_t st; double s = 0; double d = 1; int i;

if (clock_getres (CLOCK_REALTIME, &tmsp) == -1) { perror ("CLOCK_GETRES"); return (1); } printf ("Разрешающая способность общесистемных часов: %ld нсек.\n", tmsp.tv_nsec);

if (clock_gettime (CLOCK_REALTIME, &tmsp) == -1) { perror ("CLOCK_GETTIME"); return (2); } printf ("Текущее время по общесистемным часам: %ld сек. %ld нсек.\n", tmsp.tv_sec, tmsp.tv_nsec);

(void) gettimeofday (&tmvl, NULL); printf ("Текущее время, функция gettimeofday(): %ld сек. %ld мксек.\n", tmvl.tv_sec, tmvl.tv_usec);

(void) time (&st); for (i = 1; i <= 100000000; i++) { s += d / i; d = -d; } printf ("Время выполнения цикла: %g сек.\n", difftime (time (NULL), st));

return (0); }

Листинг 12.6. Пример программы, использующей функции опроса показаний часов реального времени.

Результаты работы этой программы могут выглядеть так, как показано в листинге 12.7.

Разрешающая способность общесистемных часов: 10000000 нсек. Текущее время по общесистемным часам: 1072534678 сек. 296598000 нсек. Текущее время, функция gettimeofday(): 1072534678 сек. 296637 мксек. Время выполнения цикла: 15 сек.

Листинг 12.7. Возможные результаты работы программы, использующей функции опроса показаний часов реального времени.




Начало  Назад  Вперед



Книжный магазин