Создать таймер
#include <signal.h>#include <time.h>int timer_create( clockid_t clock_id,struct sigevent *evp,timer_t *timerid );
CLOCK_SOFTTIME
для сна, не "разбудит" процессор, когда приложение должно проснуться. Это позволит процессору перейти в режим энергосбережения. Когда процессор не находится в режиме энергосбережения таймеры типа CLOCK_SOFTTIME
аналогичны типу CLOCK_REALTIME
. NULL
, или указатель на структуру struct sigevent, содержащую событие, которое будет доставлено при срабатывании таймера.libc
Функция timer_create() создает для процесса таймер, использующий тип часов clock_id.
![]() | Функция завершится с ошибкой, если указанный в ней тип clock ID не соответствует типу clock ID того процесса или потока, который эту функцию вызвал. |
Идентификатор таймера, который функция запишет в timerid, в дальнейшем используется в функциях timer_gettime(), timer_settime() и timer_delete().
Таймер будет создан выключенным. Для его включения используется функция timer_settime().
Типы событий для таймера:
Если параметр evp равен NULL
, то при срабатывании таймера процессу будет направлен сигнал SIGALRM
. Процесс может установить обработчик для этого сигнала с помощью функции sigaction().
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_MINAVAILtypedef 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 системной библиотеки