1. 前言
TODO
2. 应用
2.1 API
extern int timer_create(clockid_t __clock_id, struct sigevent *__evp, timer_t *__timerid);
extern int timer_delete(timer_t __timerid);
extern int timer_getoverrun(timer_t __timerid);
extern int timer_gettime(timer_t __timerid, struct itimerspec *__value);
extern int timer_settime(timer_t __timerid, int __flags, const struct itimerspec *__value, struct itimerspec *__ovalue);
2.2 消息触发(定时)
进程中触发定时消息,定时处理任务。
2.3 心跳
通讯中依据定时心跳实现服务/进程监测以及保活。
3. 实操
脉冲(Pulse)模式: //伪代码如下
typedef union {
struct _pulse pulse;
/* your other message structures would go here too */
} my_message_t;
main() {
struct sigevent event;
struct itimerspec itime;
timer_t timer_id;
int chid;
int rcvid;
my_message_t msg;
/* sigevent set up */
chid = ChannelCreate(0);
event.sigev_notify = SIGEV_PULSE;
event.sigev_coid = ConnectAttach(ND_LOCAL_NODE, 0, chid, _NTO_SIDE_CHANNEL, 0); // --> chid
//event.sigev_priority = getprio(0);
event.sigev_priority = SIGEV_PULSE_PRIO_INHERIT;
event.sigev_code = _PULSE_CODE_MINAVAIL; //_PULSE_CODE_MINAVAIL --> msg.pulse.code
/* timer create */
timer_create(CLOCK_REALTIME, &event, &timer_id);
// timer expire value
itime.it_value.tv_sec = 1; //启动时间
/* 500 million nsecs = .5 secs */
//itime.it_value.tv_nsec = 500000000; //时间偏移.5
itime.it_value.tv_nsec = 50000000;
// timer reload value - restart/repeat
itime.it_interval.tv_sec = 1; //间隔时间,间隔1S触发
/* 500 million nsecs = .5 secs */
itime.it_interval.tv_nsec = 50000000; //时间偏移.5
timer_settime(timer_id, 0, &itime, NULL);
/*
* As of the timer_settime(), we will receive our pulse
* in 1.5 seconds (the itime.it_value) and every 1.5
* seconds thereafter (the itime.it_interval)
*/
for (;;) {
rcvid = MsgReceive(chid, &msg, sizeof(msg), NULL);
if (rcvid == 0) { /* we got a pulse */
if (msg.pulse.code == MY_PULSE_CODE) {
printf("timer trigger\n"); //依照上面配置,1S打印一次
} /* else other pulses ... */
} /* else other messages ... */
}
}