Linux repositories inspector
Linux
2009-03-15
Aliases: setitimer(2), setitimer(2), setitimer(2), setitimer(2), setitimer(2), setitimer(2), setitimer(2), setitimer(2), setitimer(2), setitimer(2), setitimer(2), setitimer(2)

man-pages-ru

Russian man pages from the Linux Documentation Project

manpages-dev

Manual pages about using GNU/Linux for development

man-pages

Linux kernel and C library user-space interface documentation

ИМЯ

getitimer, setitimer - считывает или устанавливает значение таймера интервалов

ОБЗОР

#include <sys/time.h>

int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);

ОПИСАНИЕ

Система предоставляет каждому процессу три таймера интервалов, значение каждого из которых уменьшается на единицу по истечении установленного времени. Когда на одном из таймеров истекает время, процессу отправляется сигнал и таймер (обычно) перезапускается.
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() заполняет структуру, указанную в curr_value текущей настройкой таймера, задаваемого which (ITIMER_REAL, ITIMER_VIRTUAL или ITIMER_PROF). Поле it_value устанавливается в соответствии с тем количеством времени, которое осталось на таймере, или приравнивается нулю, если таймер выключен. Аналогично устанавливается it_interval в значение сброса.
Функция setitimer() устанавливает значение таймера равным величине, указанной в new_value. Если значение old_value не равно NULL, то в неё записывается прежнее значение таймера.
Значения таймеров уменьшаются от величины it_value до нуля, выдаётся сигнал, и значения вновь устанавливаются равными it_interval. Таймер, установленный на ноль (его величина it_value равна нулю, или время вышло и величина it_interval равна нулю), останавливается.
Величины tv_sec и tv_usec являются основными при установке таймера.
Срок на таймерах никогда не заканчивается ранее указанного времени, но может (чуть-чуть) опоздать, что зависит от степени разрешения системного таймера и загрузки системы; смотрите time(7). (Но смотрите ДЕФЕКТЫ далее.) По истечении времени будет послан сигнал, а таймер обнулится. Если время таймера истекает во время работы процесса (всегда, если используется ITIMER_VIRTUAL), то сигнал после создания будет доставлен немедленно. Иначе отсылка сигнала откладывается на небольшой промежуток времени, зависящий от степени загруженности системы.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

При успешном выполнении возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

EFAULT Указатели new_value, old_value или curr_value являются некорректными.
EINVAL Значение which не равно ITIMER_REAL, ITIMER_VIRTUAL или ITIMER_PROF; или (начиная с Linux 2.6.22) одно из полей структуры tv_usec, указанной в new_value, содержит значение вне диапазона от 0 до 999999.

СООТВЕТСТВИЕ СТАНДАРТАМ

POSIX.1-2001, SVr4, 4.4BSD (впервые этот вызов появился в 4.2BSD). В POSIX.1-2008 вызовы getitimer() и setitimer() помечены как устаревшие, и вместо них рекомендуется использовать программный интерфейс таймеров POSIX (timer_gettime(2), timer_settime(2) и т.д.).

ЗАМЕЧАНИЯ

Потомок, созданный через fork(2), не наследует таймеры интервалов родителя. При вызове execve(2) таймеры интервалов сохраняются.
В POSIX.1 не определено взаимодействие между setitimer() и тремя интерфейсами: alarm(2), sleep(3) и usleep(3).

ДЕФЕКТЫ

Генерирование и доставка сигнала разделены, и только один экземпляр каждого сигнала, которые описаны выше, может ожидать передачи в процесс. При очень большой нагрузке, ожидание таймера ITIMER_REAL может завершиться раньше чем будет доставлен сигнал о предыдущем завершении. Второй сигнал об этом событии будет потерян.
В ядрах Linux до версии 2.6.16, значения таймеров указывались в мигах. Если запрашивалась установка таймера в значение, представление в мигах которого превышало MAX_SEC_IN_JIFFIES (определено в include/linux/jiffies.h), то значение таймера просто урезалось до этого максимального значения. На Linux/i386 (где, начиная с Linux 2.6.13, по умолчанию миг равен 0.004 секунды), это означало, что максимальное значение таймера приблизительно равнялось 99.42 дня. Начиная с Linux 2.6.16, в ядрах стали использовать другое внутреннее представление времени, и этот предел был снят.
В некоторых системах (включая i386), ядра Linux до версии 2.6.12 содержали дефект, который при определённых условиях приводил к преждевременному завершению за один миг (jiffy). Этот дефект исправлен в ядре 2.6.12.
В POSIX.1-2001 сказано, что setitimer() должен завершаться с ошибкой, если значение tv_usec лежит вне диапазона от 0 до 999999. Однако, в ядрах до версии 2.6.21 включительно, в Linux ошибка не выдаётся, а вместо этого значение таймера просто подгоняется под соответствующие секунды. Начиная с ядра 2.6.22, это несоответствие убрано: некорректное значение tv_usec приводит к ошибке EINVAL.

REFERENCED BY

⇧ Top