Man page - getitimer(2)

Packages contains this manual

Available languages:

en fr pl nl ja ru ro de

Manual

getitimer

НАИМЕНОВАНИЕ
БИБЛИОТЕКА
ОБЗОР
ОПИСАНИЕ
getitimer()
setitimer()
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
ОШИБКИ
ВЕРСИИ
СТАНДАРТЫ
ИСТОРИЯ
ПРИМЕЧАНИЯ
ОШИБКИ
СМОТРИТЕ ТАКЖЕ
ПЕРЕВОД

НАИМЕНОВАНИЕ

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 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков .