setitimer()

Установить значение интервального таймера

Прототип:

#include <sys/time.h>
int setitimer( int which,
const struct itimerval *value,
struct itimerval *ovalue );

Аргументы:

which
Тип интервального таймера, значение которого необходимо установить. В настоящее время тип должен быть ITIMER_REAL.
value
Указатель на структуру struct itimerval, в которой задается устанавливаемое значение интервального таймера.
ovalue
NULL, или указатель на структуру struct itimerval, в которую функция запишет предыдущее значение интервального таймера.

Библиотека:

libc

Описание:

Система предоставляет каждому процессу несколько типов интервальных таймеров, определенных в <sys/time.h>.

Функция setitimer() устанавливает таймер с типом which в соответствии со значением структуры value. Если указатель на структуру ovalue не равен NULL, то в этой структуре сохраняется предыдущее значение таймера.

Значение таймера определяется в структуре struct itimerval. Установка параметра it_value в 0 выключит таймер не зависимо от значения it_interval. Это произойдет после следующего истечения таймера при условии, что параметр it_value имеет ненулевое значение.

Если значения времени меньше, чем разрешение системных часов, то они округляются до этого разрешения.

Единственным поддерживаемым типом таймера является ITIMER_REAL, который уменьшается (декрементируется) в реальном времени. В момент истечения этого таймера генерируется сигнал SIGALRM.

Сгенерированный сигнал SIGALRM не маскируется в этом потоке никакой функцией маскирования сигналов типа pthread_sigmask() или sigprocmask().


Note: Из-за особенностей измерения времени таймер может фактически истечь позже указанного времени.

Возвращаемое значение:

0
Успешное завершение.
-1
Возникла ошибка. Код ошибки записан в errno.

Коды ошибок:

EINVAL
Количество секунд указано более 100,000,000, или количество микросекунд указано более или равным 1,000,000, или не распознан аргумент which.

Классификация:

POSIX 1003.1 XSI

Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Предостережения:

Флаги функции setitimer() отличные от ITIMER_REAL ведут себя так, как описано только в “связанных” (bound) потоках. Их способность маскировать сигнал работает только со связанными потоками. Если вызов выполняется с использованием одного из этих флагов из несвязанного потока, системный вызов возвратит-1 и установит значение переменной errno в EACCES.

Данное поведение одинаково для связанных или несвязанных потоков POSIX. POSIX поток с общесистемным действием (system-wide scope), созданный функцией:

pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );

эквивалентен связанному потоку Solaris. POSIX поток локального действия (local process scope), созданный функцией:

pthread_attr_setscope( &attr, PTHREAD_SCOPE_PROCESS );

эквивалентен несвязанному потоку Solaris.

Значение в поле микросекунд не должно быть равно или превышать одну секунду.

Функция setitimer() независима от alarm().

Не рекомендуется использовать вызов setitimer( ITIMER_REAL ) вместе с функцией sleep(), поскольку sleep() стирает информацию о пользовательском обработчике сигнала SIGALRM.

Точность временного разрешения для срабатывания alarm зависит от аппаратной платформы.

Тематические ссылки:

struct itimerval, alarm(), getitimer(), gettimeofday(), pthread_attr_setscope(), pthread_sigmask(), sigprocmask(), sleep(), sysconf()




Предыдущий раздел: Описание API системной библиотеки