int setitimer(intwhich,const struct itimerval*value,struct itimerval*ovalue);
ОПИСАНИЕ
Система предоставляет каждому процессу три таймера, значение каждого
из которых уменьшается на единицу по истечении установленного времени.
Когда на одном из таймеров истекает время, то процессу оправляется
сигнал и таймер (обычно) перезапускается.
ITIMER_REAL
уменьшается постоянно (в режиме реального времени) и подает сигнал
SIGALRM,
когда значение таймера становится равным 0.
ITIMER_VIRTUAL
уменьшается только во время работы процесса и подает сигнал
SIGVTALRM,
когда значение таймера становится равным 0.
ITIMER_PROF
уменьшается во время работы процесса и когда система выполняет что-либо
по заданию процесса. Этот таймер обычно используется вместе с
ITIMER_VIRTUAL
для профилирования времени работы приложения в пользовательской
области и в области ядра. Когда значение таймера становится равным 0,
подается сигнал
SIGPROF.
Величина, на которую устанавливается таймер, определяется следующими структурами:
struct itimerval {
struct timeval it_interval; /* следующее значение */
struct timeval it_value; /* текущее значение */
};
struct timeval {
long tv_sec; /* секунды */
long tv_usec; /* микросекунды */
};
Функция
getitimer(2)
заполняет структуру
value
текущим значением
which
(
ITIMER_REAL,
ITIMER_VIRTUAL,
или
ITIMER_PROF).
it_value
устанавливается в соответствии с тем количеством времени, которое осталось
на таймере, или приравнивается нулю, если таймер выключен.
Аналогично устанавливается
it_interval.
Функция
setitimer(2)
устанавливает значение таймера равным величине, указанной в
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).
В Linux, все генерируемые сигналы являются уникальными и на каждый из них
система отвечает уникальным процессом. При чрезвычайной перегруженности ситемы
ITIMER_REAL
может закончиться до того момента, как будет доставлен сигнал от предыдущего.
И таким образом, сигнал от последующего таймера будет потерян.