Provided by: manpages-ru-dev_4.27.0-1_all 

НАИМЕНОВАНИЕ
getitimer, setitimer - считывает или устанавливает значение таймера интервалов
БИБЛИОТЕКА
Стандартная библиотека языка C (libc, -lc)
ОБЗОР
#include <sys/time.h>
int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, const struct itimerval *restrict new_value,
struct itimerval *_Nullable restrict old_value);
ОПИСАНИЕ
Данные системные вызовы предоставляют доступ к интервальным таймерам, то есть таймерам, у которых
изначально истекает срок в будущем, и (необязательно) с регулярными интервалами после. Когда у таймера
истекает срок, вызвавшему процессу отправляется сигнал и таймер перезапускается с задаваемым интервалом
(если интервал не равен нулю).
Three types of timers—specified via the which argument—are provided, each of which counts against a
different clock and generates a different signal on timer expiration:
ITIMER_REAL
Этот таймер отсчитывается по реальному времени (то есть обычному). По каждому истечению выдаёт
сигнал SIGALRM.
ITIMER_VIRTUAL
Этот таймер отсчитывается по времени ЦП в пользовательском режиме, проведённым процессом (учёт
включает время ЦП, потреблённое всеми нитями процесса). По каждому истечению выдаёт сигнал
SIGVTALRM.
ITIMER_PROF
Этот таймер отсчитывается по полному времени ЦП, потраченному процессом (учёт включает время ЦП,
потреблённое всеми нитями процесса). По каждому истечению выдаёт сигнал SIGPROF.
Данный таймер вместе с ITIMER_VIRTUAL можно использовать для профилирования затрат процессом
системного и пользовательского времени ЦП.
Процесс может иметь только по одному таймеру каждого типа.
Величина, на которую устанавливается таймер, определяется следующими структурами:
struct itimerval {
struct timeval it_interval; /* Interval for periodic timer */
struct timeval it_value; /* Time until next expiration */
};
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
getitimer()
Функция getitimer() помещает текущее значение таймера, указанного в which, в буфер, указанный в
curr_value.
Вложенная структура it_value содержит количество оставшегося времени до следующего истечения таймера. Это
значение изменяется после начала отсчёта таймера и будет сброшено в it_interval при истечении таймера.
Если оба поля it_value равны нулю, то это означает что таймер выключен (неактивен).
Вложенная структура it_interval содержит интервал таймера. Если оба поля it_intervalравны нулю, то это
указывает на одноразовый таймер (то срабатывающий один раз).
setitimer()
Функция setitimer() настраивает таймер which значением new_value. Если значение old_value не NULL, то оно
указывает на буфер, в который сохраняется предыдущее значение таймера (т. е., информация, возвращаемая
getitimer()).
Если какое-то из полей в new_value.it_value не равно нулю, то таймер изначально включается как
просроченный на указанное время. Если оба поля в new_value.it_value равны нулю, то таймер отключён.
Поле new_value.it_interval задаёт новый интервал таймера;если оба поля равны нулю, то таймер будет
одноразовым.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении возвращается 0. При ошибке возвращается -1, а в errno содержится код ошибки.
ОШИБКИ
EFAULT Указатели new_value, old_value или curr_value являются некорректными.
EINVAL which is not one of ITIMER_REAL, ITIMER_VIRTUAL, or ITIMER_PROF; or (since Linux 2.6.22) one of
the tv_usec fields in the structure pointed to by new_value contains a value outside the range [0,
999999].
ВЕРСИИ
В стандартах ничего не говорится о значении вызова:
setitimer(which, NULL, &old_value);
В многих системах (Solaris, BSD и, возможно, другие) он считается эквивалентом:
getitimer(which, &old_value);
В Linux это эквивалентно вызову, в котором поля new_value равны 0, то есть таймер выключен. Не
используйте это особенность Linux: это непереносимо и нецелесообразно.
СТАНДАРТЫ
POSIX.1-2008.
ИСТОРИЯ
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).
ОШИБКИ
Генерирование и доставка сигнала разделены, и только один экземпляр каждого сигнала, которые описаны
выше, может ожидать передачи в процесс. При очень большой нагрузке, ожидание таймера ITIMER_REAL может
завершиться раньше чем будет доставлен сигнал о предыдущем завершении. Второй сигнал об этом событии
будет потерян.
Before Linux 2.6.16, timer values are represented in jiffies. If a request is made set a timer with a
value whose jiffies representation exceeds MAX_SEC_IN_JIFFIES (defined in include/linux/jiffies.h), then
the timer is silently truncated to this ceiling value. On Linux/i386 (where, since Linux 2.6.13, the
default jiffy is 0.004 seconds), this means that the ceiling value for a timer is approximately 99.42
days. Since Linux 2.6.16, the kernel uses a different internal representation for times, and this
ceiling is removed.
On certain systems (including i386), Linux kernels before Linux 2.6.12 have a bug which will produce
premature timer expirations of up to one jiffy under some circumstances. This bug is fixed in Linux
2.6.12.
POSIX.1-2001 says that setitimer() should fail if a tv_usec value is specified that is outside of the
range [0, 999999]. However, up to and including Linux 2.6.21, Linux does not give an error, but instead
silently adjusts the corresponding seconds value for the timer. From Linux 2.6.22 onward, this
nonconformance has been repaired: an improper tv_usec value results in an EINVAL error.
СМОТРИТЕ ТАКЖЕ
gettimeofday(2), sigaction(2), signal(2), timer_create(2), timerfd_create(2), time(7)
ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>,
Dmitry Bolkhovskikh <d20052005@yandex.ru>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov
<yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>
Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной
лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или
более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских
переводчиков.
Справочные страницы Linux 6.9.1 2 мая 2024 г. getitimer(2)