[英]How to handle multiple timer signals
int main ()
{
int i=0;
timer_t t_id[100];
for(i=0; i<100; i++)
makeTimer(NULL, &t_id[i], i+1, 0);
/* Do busy work. */
while (1);
}
static int makeTimer( char *name, timer_t *timerID, int sec, int msec )
{
struct sigevent te;
struct itimerspec its;
struct sigaction sa;
int sigNo = SIGRTMIN;
/* Set up signal handler. */
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = timer_handler;
sigemptyset(&sa.sa_mask);
if (sigaction(sigNo, &sa, NULL) == -1)
{
printf("sigaction error\n");
return -1;
}
/* Set and enable alarm */
te.sigev_notify = SIGEV_SIGNAL;
te.sigev_signo = sigNo;
te.sigev_value.sival_ptr = timerID;
timer_create(CLOCK_REALTIME, &te, timerID);
its.it_interval.tv_sec = sec;
its.it_interval.tv_nsec = msec * 1000000;
its.it_value.tv_sec = sec;
its.it_value.tv_nsec = msec * 1000000;
timer_settime(*timerID, 0, &its, NULL);
return 0;
}
static void timer_handler( int sig, siginfo_t *si, void *uc )
{
timer_t *tidp;
tidp = si->si_value.sival_ptr;
/* how to know the timer_id with index? */
}
在此代码上,我制作了许多计时器,这些计时器的ID由数组结构组成。
如果发生超时事件,则所有计时器共享一个timer_handler。 但是我怎么知道哪个索引的(t_id [index])超时了?
可能吗? 我的意思是我想知道哪个索引发生了超时。
一个使用结构的简单示例:
struct timer_event_data
{
timer_t id;
size_t index; // Array index, not really needed IMO
// Other possible data
};
#define NUMBER_TIMER_EVENTS 100
int main(void)
{
struct timer_event_data timer_data[NUMBER_TIMER_EVENTS];
for (size_t i = 0; i < NUMBER_TIMER_EVENTS; ++i)
{
// Initialize structure
timer_data[i].index = i;
// Start timer
makeTimer(NULL, &timer_data[i], i + 1, 0);
}
// Main processing loop
for (;;)
{
// ...
}
return 0;
}
void makeTimer(const char *name, struct timer_event_data *timer_data, unsigned sec, unsigned msec)
{
...
te.sigev_value.sival_ptr = timer_data;
timer_create(CLOCK_REALTIME, &te, &timer_data->id);
...
}
static void timer_handler( int sig, siginfo_t *si, void *uc )
{
struct timer_event_data *timer_data = si->si_value.sival_ptr;
// Use data in structure any way you want
}
您可以定义一个指向t_id
的第一个元素的全局指针:
timer_t * pt_id;
在main()
初始化它:
timer_t t_id[100];
pt_id = t_id;
然后在计时器函数内部,通过将差异取到数组来计算所需的索引,如下所示:
size_t tidx = tidp - pt_id - 1;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.