ualarm()

Запланировать отправку сигнала

Прототип:

#include <unistd.h>
useconds_t ualarm( useconds_t usec,
useconds_t interval );

Аргументы:

usec
Количество миллисекунд, по истечению которых будет отправлен первый сигнал, или 0 для отмены любого предыдущего запроса на отправку сигнала.
interval
Количество миллисекунд, по истечению которых будет отправляться каждый последующий сигнал.

Библиотека:

libc

Описание:

Функция ualarm() приводит к отправке системой сигнала SIGALRM вызывающему процессу через usec миллисекунд реального времени. Затем сигнал будет отправляться каждые interval миллисекунд.

Задержки процессора при диспетчеризации могут привести к задержке между тем, когда сигнал отправляется и когда процесс действительно обработает его.

Если usec равен 0, любой предыдущий запрос ualarm() отменяется.


Note: Из-за особенностей отсчёта времени сигнал может быть послан позже указанного времени.

Возвращаемое значение:

0
Ранее не было запросов ualarm().
-1
Возникла ошибка. Код ошибки записан в errno.
Любое другое значение
Количество миллисекунд до отправки следующего запланированного сигнала SIGALRM.

Коды ошибок:

EAGAIN
Все таймеры заняты; подождите, пока процесс освободит таймер и попробуйте ещё раз.

Примеры:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main( void )
{
useconds_t timeleft;
printf( "Set the alarm and sleep\n" );
ualarm( (useconds_t)( 10 * 1000 * 1000 ), 0 );
sleep( 5 ); /* go to sleep for 5 seconds */
/*
* Чтобы узнать время до следующего прибытия SIGALRM, нужно отменить
* изначальный таймер, что вернёт количество времени, которое ему оставалось.
*/
timeleft = ualarm( 0, 0 );
printf( "Time left before cancel, and rearm: %ld\n", timeleft );
/* Устанавливаем новый таймер, который разбудит нас, когда пройдёт timeleft миллисекунд. */
ualarm( timeleft, 0 );
/*
* Подождём получение сигнал SIGALRM; любой сигнал убивает нас,
* поскольку отсутствует обработчик сигналов.
*/
printf( "Hanging around, waiting to exit\n" );
pause();
/* До сюда не дойдёт. */
return (EXIT_SUCCESS);
}

Классификация:

POSIX 1003.1 XSI

Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Предостережения:

Запросы от функций alarm(), TimerAlarm() и ualarm() не накапливаются; этими функциями можно запланировать доставку только одного сигнала SIGALRM. Если SIGALRM ещё не был сгенерирован, следующий вызов alarm(), TimerAlarm() или ualarm() перепланирует его время генерации.

Не смешивайте вызовы ualarm() с nanosleep(), sleep(), timer_create(), timer_delete(), timer_getoverrun(), timer_gettime(), timer_settime() или usleep().

Тематические ссылки:

alarm(), nanosleep(), sigaction(), sleep(), timer_create(), timer_delete(), timer_getoverrun(), timer_gettime(), timer_settime(), TimerAlarm(), usleep()




Предыдущий раздел: Описание API системной библиотеки