Главная » 2017 » Ноябрь » 19 » man 2 getitimer
22:21
man 2 getitimer

SEO sprint - Всё для максимальной раскрутки!





ИМЯ


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);



ОПИСАНИЕ


Данные системные вызовы предоставляют доступ к интервальным таймерам, то есть
таймерам, у которых изначально истекает срок в будущем, и (необязательно) с
регулярными интервалами после. Когда у таймера истекает срок, вызвавшему процессу
отправляется сигнал и таймер перезапускается с задаваемым интервалом (если
интервал не равен нулю).

В аргументе which можно задать три типа таймеров, каждый выполняет отсчёт по
разным часам и генерирует разный сигнал по истечении срока:

ITIMER_REAL Этот таймер отсчитывается по реальному времени (то есть обычному).
По каждому истечению выдаёт сигнал SIGALRM.

ITIMER_VIRTUAL Этот таймер отсчитывается по времени ЦП в пользовательском режиме,
проведённым процессом (учёт включает время ЦП, потреблённое всеми
нитями процесса). По каждому истечению выдаёт сигнал SIGVTALRM.

ITIMER_PROF Этот таймер отсчитывается по полному времени ЦП, потраченному
процессом (учёт включает время ЦП, потреблённое всеми нитями
процесса). По каждому истечению выдаёт сигнал SIGPROF.

Данный таймер вместе с ITIMER_VIRTUAL можно использовать для
профилирования затрат процессом системного и пользовательского
времени ЦП.

Процесс может иметь только по одному таймеру каждого типа.

Величина, на которую устанавливается таймер, определяется следующими структурами:

struct itimerval {
struct timeval it_interval; /* интервал для периодического таймера */
struct timeval it_value; /* время до следующего окончания */
};

struct timeval {
time_t tv_sec; /* секунды */
suseconds_t tv_usec; /* микросекунды */
};

getitimer()
Функция getitimer() помещает текущее значение таймера, указанного в which, в
буфер, указанный в curr_value.

Вложенная структура it_value содержит количество оставшегося времени до следующего
истечения таймера. Это значение изменяется после начала отсчёта таймера и будет
сброшено в it_interval при истечении таймера. Если оба поля it_value равны нулю,
то это означает что таймер выключен (неактивен).

Если какое-то из полей в new_value.it_value не равно нулю, то таймер изначально
включается как просроченный на указанное время. Если оба поля в new_value.it_value
равны нулю, то таймер отключён.

Поле new_value.it_interval задаёт новый интервал таймера;если оба поля равны нулю,
то таймер будет одноразовым.



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


При успешном выполнении возвращается 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) и т.д.).



ЗАМЕЧАНИЯ


Срок на таймерах никогда не заканчивается ранее указанного времени, но может
(чуть-чуть) опоздать, что зависит от степени разрешения системного таймера и
загрузки системы; смотрите time(7) (но смотрите ДЕФЕКТЫ далее). Если время таймера
истекает во время работы процесса (всегда, если используется ITIMER_VIRTUAL), то
сигнал после создания будет доставлен немедленно.

Потомок, созданный через fork(2), не наследует таймеры интервалов родителя. При
вызове execve(2) таймеры интервалов сохраняются.

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

В стандартах ничего не говорится о значении вызова:

setitimer(which, NULL, &old_value);

В многих системах (Solaris, BSD и, возможно, другие) он считается эквивалентом:

getitimer(which, &old_value);

В Linux это эквивалентно вызову, в котором поля new_value равны 0, то есть таймер
выключен. Не используйте это особенность Linux: это непереносимо и
нецелесообразно.



ДЕФЕКТЫ


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

В некоторых системах (включая 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.



СМОТРИТЕ ТАКЖЕ


gettimeofday(2), sigaction(2), signal(2), timer_create(2), timerfd_create(2),
time(7)



Категория: (2) Системные вызовы ядра (функции языка Си) | Просмотров: 546 | Добавил: Администратор | Рейтинг: 0.0/0
Всего комментариев: 0
avatar