TIMER_SETTIME(2)

ИМЯ
timer_settime, timer_gettime - запускает/останавливает и возвращает состояние таймера POSIX некоторого процесса

ОБЗОР
#include <time.h>
int timer_settime(timer_t timerid, int flags,
                  const struct itimerspec *new_value,
                  struct itimerspec *old_value);
int timer_gettime(timer_t timerid, struct itimerspec *curr_value);
Компонуется при указании параметра -lrt.

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

timer_settime(), timer_gettime(): _POSIX_C_SOURCE >= 199309L

ОПИСАНИЕ
Вызов timer_settime() запускает или останавливает таймер, указанный в timerid. Аргумент new_value — это указатель на структуру itimerspec, которая определяет новое начальное значение и новый интервал таймера. Структура itimerspec определена следующим образом:
struct timespec {
    time_t tv_sec;                /* секунды */
    long   tv_nsec;               /* наносекунды */
};
struct itimerspec {
    struct timespec it_interval;  /* интервал таймера */
    struct timespec it_value;     /* первое срабатывание */
};
Каждая подструктура структуры itimerspec представляет собой структуру timespec, которая позволяет задавать значение времени в секундах и наносекундах. Эти значения времени отсчитываются по часам, которые были указаны при создании таймера с помощью timer_create(2). Если new_value->it_value равно ненулевому значению (т. е., любое из подполей не равно нулю), то timer_settime() запускает таймер, устанавливая ему первое время срабатывания (если таймер уже запущен, то предыдущие параметры перезаписываются). Если new_value->it_value равно нулю (т. е., оба подполя равны нулю), то таймер выключается. В поле new_value->it_interval указывается период таймера в секундах и наносекундах. Если это поле равно нулю, то каждый раз, когда таймер срабатывает, он перезапускается со значением, указанным в new_value->it_interval. Если new_value->it_interval равно нулю, то таймер срабатывает только один раз, согласно заданному в it_value времени. По умолчанию, начальное время срабатывания, указанное в new_value->it_value, считается относительно текущего времени на часах таймера на момент вызова. Это можно изменить, указав TIMER_ABSTIME в flags; в этом случае new_value->it_value рассматривается как абсолютное значение по часам таймера; то есть таймер сработает, когда значение часов достигнет значения, указанного в new_value->it_value. Если указанное абсолютное время уже прошло, то таймер срабатывает немедленно и счётчик переполнения изменяется соответствующим образом (смотрите timer_getoverrun(2)). Если значение часов CLOCK_REALTIME корректируется (adjusted) и указано абсолютное значение у включённого таймера с этими часами, то срабатывание таймера будет скорректировано соответствующим образом. Корректировка часов CLOCK_REALTIME не влияет на относительные таймеры, использующие эти часы. Если значение old_value не равно NULL, то оно указывает на буфер, который используется для возврата предыдущего интервала таймера (в old_value->it_interval) и количества времени, которое осталось таймеру до срабатывания (в old_value->it_value). Вызов timer_gettime() возвращает время до следующего срабатывания таймера timerid и интервал в буфер curr_value. Оставшееся время до следующего срабатывания возвращается в curr_value->it_value; это всегда относительное значение, независимо от того, указывался ли флаг TIMER_ABSTIME при включении таймера. Если значение curr_value->it_value равно нулю, то таймер в данный момент выключен. Интервал таймера возвращается в curr_value->it_interval. Если значение curr_value->it_interval равно нулю, то это «одноразовый» таймер.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении timer_settime() и timer_gettime() возвращается 0. При ошибке возвращается -1, а в errno содержится код ошибки.

ОШИБКИ
Эти функции могут завершиться со следующими ошибками:

EFAULT
    Некорректный указатель new_value, old_value или curr_value.

EINVAL
    Неверное значение timerid.

timer_settime() может завершиться со следующими ошибками:

EINVAL
    Значение new_value.it_value отрицательно; или new_value.it_value.tv_nsec отрицательно или больше 999999999.

ВЕРСИИ
Данные системные вызовы появились в Linux 2.6.

СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001.

ПРИМЕР
Смотрите timer_create(2).

СМОТРИТЕ ТАКЖЕ
timer_create(2), timer_getoverrun(2), time(7)