timer_create()

Создать таймер

Прототип:

#include <signal.h>
#include <time.h>
int timer_create( clockid_t clock_id,
struct sigevent *evp,
timer_t *timerid );

Аргументы:

clock_id
Тип часов (clock ID) для таймера:
CLOCK_REALTIME
стандартные часы, определенные в POSIX. Основанные на этих часах таймеры, разбудят процессор, если он находится в режиме энергосбережения.
CLOCK_SOFTTIME
эти часы активны, когда процессор не находится в режиме энергосбережения. Например, приложение, использующее таймер на базе CLOCK_SOFTTIME для сна, не "разбудит" процессор, когда приложение должно проснуться. Это позволит процессору перейти в режим энергосбережения. Когда процессор не находится в режиме энергосбережения таймеры типа CLOCK_SOFTTIME аналогичны типу CLOCK_REALTIME.
CLOCK_MONOTONIC
эти часы всегда увеличиваются с постоянной скоростью и не могут быть отрегулированы.
evp
NULL, или указатель на структуру struct sigevent, содержащую событие, которое будет доставлено при срабатывании таймера.
timerid
Указатель на объект типа timer_t, в котором функция сохранит идентификатор созданного таймера.

Библиотека:

libc

Описание:

Функция timer_create() создает для процесса таймер, использующий тип часов clock_id.


Note: Функция завершится с ошибкой, если указанный в ней тип clock ID не соответствует типу clock ID того процесса или потока, который эту функцию вызвал.

Идентификатор таймера, который функция запишет в timerid, в дальнейшем используется в функциях timer_gettime(), timer_settime() и timer_delete().

Таймер будет создан выключенным. Для его включения используется функция timer_settime().

Типы событий для таймера:

SIGEV_SIGNAL
SIGEV_SIGNAL_CODE
SIGEV_SIGNAL_THREAD
SIGEV_PULSE

Если параметр evp равен NULL, то при срабатывании таймера процессу будет направлен сигнал SIGALRM. Процесс может установить обработчик для этого сигнала с помощью функции sigaction().

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

0
Успешное завершение. В переменную timerid записан идентификатор созданного таймера.
-1
Возникла ошибка. Код ошибки записан в errno.

Коды ошибок:

EAGAIN
В системе нет свободных таймеров. В этом случае можно подождать, когда процесс освободит один из своих таймеров.
EINVAL
Значение clock_id не является корректной константой типа CLOCK_*.

Примеры:

/*
* Программа создает таймер, который после своего срабатывания
* посылает пульс. Первый раз таймер срабатывает через 1.5 сек.,
* а затем с периодом каждые 1.5 сек.
*/
#include <stdio.h>
#include <time.h>
#include <sys/netmgr.h>
#include <sys/neutrino.h>
#define MY_PULSE_CODE _PULSE_CODE_MINAVAIL
typedef union {
struct _pulse pulse;
/* здесь могут быть другие структуры сообщения */
} my_message_t;
void main()
{
struct sigevent event;
struct itimerspec itime;
timer_t timer_id;
int chid;
int rcvid;
my_message_t msg;
chid = ChannelCreate( 0 );
event.sigev_notify = SIGEV_PULSE;
event.sigev_coid = ConnectAttach( ND_LOCAL_NODE, 0, chid,
_NTO_SIDE_CHANNEL, 0);
event.sigev_priority = getprio( 0 );
event.sigev_code = MY_PULSE_CODE;
timer_create( CLOCK_REALTIME, &event, &timer_id );
itime.it_value.tv_sec = 1;
itime.it_value.tv_nsec = 500000000; /* 500 million nsecs = .5 secs */
itime.it_interval.tv_sec = 1;
itime.it_interval.tv_nsec = 500000000; /* 500 million nsecs = .5 secs */
timer_settime( timer_id, 0, &itime, NULL );
/*
* После вызова timer_settime() процесс получит
* пульс через 1.5 секунды (itime.it_value)
* и затем каждые 1.5 секунды (the itime.it_interval)
*/
for ( ; ; )
{
rcvid = MsgReceive( chid, &msg, sizeof( msg ), NULL );
if ( rcvid == 0 )
{
/* получен пульс от таймера*/
if ( msg.pulse.code == MY_PULSE_CODE )
{
printf( "получен пульс от таймера\n" );
} /* иначе другой пульс ... */
} /* иначе другое сообщение ... */
}
}

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

POSIX 1003.1 Timers

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

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

clock_getres(), clock_gettime(), clock_settime(), nanosleep(), struct _pulse, sigaction(), struct sigevent, sleep(), timer_t, TimerCreate(), timer_delete(), timer_getexpstatus(), timer_getoverrun(), timer_gettime(), timer_settime()




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