GETITIMER(2)

ИМЯ
getitimer, setitimer - получить или установить значение внутреннего таймера

ОБЗОР
#include <sys/time.h>

int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);

ОПИСАНИЕ
Система предоставляет каждому процессу три внутренних таймера, каждый из которых работает в отдельном временном домене. Когда любой из этих таймеров истекает, процессу, в котором функционировал данный таймер посылается сигнал и таймер (потенциально) перезапускается.

ITIMER_REAL
    работает в реальном времени и по истечении отправляет сигнал SIGALRM .

ITIMER_VIRTUAL
    работает только, когда процесс выполняется и по истечении отправляет сигнал SIGVTALRM .

ITIMER_PROF
    работает и когда процесс выполняется, и когда система работает в интересах процесса. Запущенный совместно с ITIMER_VIRTUAL, данный таймер обычно используется для профилирования времени, которое приложение проводит в режиме пользователя и в режиме ядра. По истечении отправляет сигнал SIGPROF .

Значения таймера задаются с помощью следующих структур:
    struct itimerval {
        struct timeval it_interval; /* next value */
        struct timeval it_value;    /* current value */
    };
    struct timeval {
        long tv_sec;                /* seconds */
        long tv_usec;               /* microseconds */
    };

Фнкция getitimer заполняет структуру, предоставляемую как value текущими установками таймера, который обозначается как which (одно из значений ITIMER_REAL, ITIMER_VIRTUAL, или ITIMER_PROF). Элемент it_value устанавливает ожидаемое время, оставшееся на таймере или ноль если таймер запрещается. Похожим образом устанавливается it_interval для значения сброса. Функция setitimer устанавливает указанный таймер в значение, указанное в value. Если ovalue не ноль, там будет сохранено старое значение таймера.

Таймеры уменьшающиеся от it_value до нуля, генерируют сигнал и сбрасываются в it_interval. Таймер, который установлен в ноль (it_value является нулем или таймер истёк и it_interval является нулём) останавливается.

Оба значения tv_sec и tv_usec являются важными при определении длительности работы таймера.

Таймеры никогда не истекают до затребованного времени, напротив они немного запаздывают, в зависимости от шага системного таймера (в настоящий момент 10 миллисекунд). По истечении будет сгенерирован сигнал и произойдёт сброс таймера. Если таймер истекает в момент когда процесс активен (это всегда так для ITIMER_VIRT), то сигнал будет доставлен немедленно после генерации. В противном случае, доставка будет отложена на небольшое время, которое зависит от степени загрузки системы.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае успеха, возвращается ноль. В случае ошибки, возвращается -1 и значение errno устанавливается соответствующим образом.

ОШИБКИ

EFAULT
    value или ovalue не являются правильными указателями.

EINVAL
    which не является одним из значений ITIMER_REAL, ITIMER_VIRT, или ITIMER_PROF.

СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, 4.4BSD (Данный вызов появился сперва в 4.2BSD).

СМОТРИ ТАКЖЕ
gettimeofday(2), sigaction(2), signal(2)

БАГИ
Под Linux, генерация и доставка сигнала разделены и каждому сигналу разрешается генерировать только один недоставленный сигнал. Таким образом, получается, что при очень сильной загрузке системы, ITIMER_REAL таймер будет истекать перед тем как будет доставлен сигнал от предыдущего истекания таймера. Второй сигнал в этом случае будет потерян.

ПЕРЕВОД
Перевёл с английского Виктор Вислобоков <corochoone@perm.ru> 2004