Provided by: manpages-ru-dev_4.21.0-2_all bug

ИМЯ

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

LIBRARY

       Standard C library (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; /* интервал для периодического таймера */
               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 равны нулю, то это означает  что
       таймер выключен (неактивен).

       Вложенная  структура 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 задаёт новый интервал таймера;если  оба  поля  равны  нулю,  то
       таймер будет одноразовым.

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

       On  success, zero is returned.  On error, -1 is returned, and errno is set to indicate the
       error.

ОШИБКИ

       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].

СТАНДАРТЫ

       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  может  завершиться  раньше  чем  будет  доставлен сигнал о
       предыдущем завершении. Второй сигнал об этом событии будет потерян.

       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>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если вы обнаружите ошибки в переводе  этой  страницы  руководства,  пожалуйста,  отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.