CLOCK_REALTIME — Общесистемные часы реального времени, доступные для изменения

CLOCK_MONOTONIC — Монотонные часы, доступные только для чтения

CLOCK_PROCESS_CPUTIME_ID — Часы процессорного времени на уровне отдельного процесса (начиная с Linux 2.6.12)

CLOCK_THREAD_CPUTIME_ID — Часы процессорного времени на уровне отдельного потока (начиная с Linux 2.6.12)

Константа CLOCK_REALTIME представляет общесистемные часы, которые измеряют обычное время. В отличие от CLOCK_MONOTONIC их можно изменять.

В стандарте SUSv3 сказано, что часы CLOCK_MONOTONIC измеряют время, начиная с какого-то «неопределенного момента в прошлом», который не меняется после запуска системы. Эти часы могут пригодиться в приложениях, на которые не должны влиять искусственные изменения системных часов (например, когда пользователь редактирует системное время). В Linux этот вид часов измеряет время, прошедшее с момента запуска системы.

Часы CLOCK_PROCESS_CPUTIME_ID измеряют пользовательское и системное процессорное время, затраченное вызывающим процессом. Часы CLOCK_THREAD_CPUTIME_ID выполняют аналогичное действие, но работают на уровне отдельных потоков внутри процесса.

Все часы, перечисленные в табл. 23.1, входят в стандарт SUSv3, но обязательной и широко распространенной в UNIX-системах является только константа CLOCK_REALTIME.

В Linux 2.6.28 появился новый тип часов, CLOCK_MONOTONIC_RAW, которые доступны только для чтения. Они похожи на CLOCK_MONOTONIC, но предоставляют доступ к «сырому» аппаратному времени, без корректировки со стороны службы NTP. Эти часы являются нестандартными и предназначены для использования в специализированных приложениях для синхронизации времени.

В Linux 2.6.32 появилось еще два типа часов: CLOCK_REALTIME_COARSE и CLOCK_MONOTIC_COARSE. Они похожи на CLOCK_REALTIME и CLOCK_MONOTONIC, но предназначены для приложений, которым нужно получать не самые точные временные метки с минимальной затратой ресурсов. Эти нестандартные константы не предоставляют доступа к аппаратным часам (что в случае с некоторыми источниками времени может оказаться довольно затратным), а точность возвращаемых ими значений соответствует минимальному временному интервалу (см. раздел 10.6).

23.5.2. Изменение значения часов: вызов clock_settime()

Системный вызов clock_settime() устанавливает время, хранящееся в буфере, на который указывает аргумент tp, для часов, определенных с помощью clockid.

#define _POSIX_C_SOURCE 199309

#include

int clock_settime(clockid_t clockid, const struct timespec *tp);

Возвращает 0 при успешном завершении или –1, если случилась ошибка

Если время, указанное с помощью tp, не является кратным минимальному временному интервалу (который возвращается вызовом clock_getres()), оно округляется в меньшую сторону.

Изменение часов CLOCK_REALTIME доступно привилегированному процессу (CAP_SYS_TIME). Их начальное значение обычно равно времени, прошедшему с начала эры UNIX. Из всех часов, перечисленных в табл. 23.1, это единственные, которые можно изменять.

Согласно стандарту SUSv3 система может позволить устанавливать время для часов CLOCK_PROCESS_CPUTIME_ID и CLOCK_THREAD_CPUTIME_ID. На момент написания данной книги в Linux эти часы были доступны только для чтения.

23.5.3. Получение идентификатора часов для определенного процесса или потока

Функции, описанные в этом разделе, позволяют получить идентификатор часов, которые измеряют процессорное время, потребленное конкретным процессом или потоком. Полученное значение можно передать вызову clock_gettime(), чтобы определить, сколько всего процессорного времени потребил процесс или поток.

Функция clock_getcpuclockid() возвращает идентификатор часов для процесса pid; итоговое значение хранится в буфере, на который указывает аргумент clockid.

#define _XOPEN_SOURCE 600

#include

int clock_getcpuclockid(pid_t pid, clockid_t *clockid);

Возвращает 0 при успешном завершении или положительный код ошибки

Если аргумент pid равен 0, вызов clock_getcpuclockid() возвращает идентификатор часов текущего процесса.

Функция pthread_getcpuclockid() аналогична вызову clock_getcpuclockid(), но работает с потоками POSIX. Она возвращает идентификатор часов, которые измеряют процессорное время, потребленное определенным потоком в рамках вызывающего процесса.

#define _XOPEN_SOURCE 600

#include

#include

int pthread_getcpuclockid(pthread_t thread, clockid_t *clockid);

Возвращает 0 при успешном завершении или положительный код ошибки

Аргумент thread обозначает идентификатор POSIX-потока, часы которого нас интересуют. Идентификатор часов возвращается в буфере, на который указывает аргумент clockid.

23.5.4. Улучшенный переход в режим сна (высокая точность): вызов clock_nanosleep()

Перейти на страницу:

Похожие книги