微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何用单个信号处理程序解决这个多个linux定时器

/ *处理程序检查存储在sival_ptr中的值是否与给定的timerIDvariables匹配。 sival_ptr与我们在makeTimer()中设置的一样,尽pipe在这里它的生活方式不同。 很显然,它从那里复制到这里的信号处理程序的路上。 重点是,timerID是用来确定哪个计时器刚刚closures,并确定接下来做什么* /

static void timerHandler( int sig,siginfo_t *si,void *uc ) { timer_t *tidp; tidp = si->si_value.sival_ptr; if ( *tidp == firstTimerID ) TASK1(Task2ms_Raster); else if ( *tidp == secondTimerID ) TASK2(Task10ms_Raster); else if ( *tidp == thirdTimerID ) TASK3(Task100ms_Raster); }

/ *函数需要一个指向timer_tvariables的指针,该variables将被timer_create()创build的计时器ID填充。 在调用timer_create()之前,该指针也保存在sival_ptrvariables中。 在这函数中注意我们总是使用SIGRTMIN信号,所以任何定时器的终止都会引起这个信号的上升。 我为这个信号编写的信号处理程序是timerHandler。 * /

static int makeTimer( char *name,timer_t *timerID,int expireMS,int intervalMS ) { //sigset_t mask; struct sigevent te; struct itimerspec its; struct sigaction sa; int sigNo = SIGRTMIN; /* Set up signal handler. */ sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = timerHandler; sigemptyset(&sa.sa_mask); if (sigaction(sigNo,&sa,NULL) == -1) { perror("sigaction"); } /* 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 = 0; its.it_interval.tv_nsec = intervalMS * 1000000; its.it_value.tv_sec = 0; its.it_value.tv_nsec = expireMS * 1000000; timer_settime(*timerID,&its,NULL); return 1; } int main() { makeTimer("First Timer",&firstTimerID,2,2); //2ms makeTimer("Second Timer",&secondTimerID,10,10); //10ms makeTimer("Third Timer",&thirdTimerID,100,100); //100ms }

我使用单处理程序来调用每2ms,10ms和100ms的任务。 我正在使用单个信号处理程序的多个定时器。 如何识别刚刚去哪个计时器。 在debugging模式下:最后一个debugging控制会话是:static void timerHandler(int sig,siginfo_t * si,void * uc){。 任何人都可以帮我解决这个问题吗?

如何检查计时器任务是否在后台运行?

POSIX计时器能否安全地修改C ++ STL对象?

计时初始化给出了任何指示?

定时器和信号中的问题

用amd64上的debian linuxtestingtimerfd_create

如何限制一个函数可以运行的时间(添加超时)?

准确的Beagle Bone Black计时器中断?

Windows服务:调用线程不能访问这个对象,因为不同的线程拥有它

Linux中的定期任务

需要产生一个稳定的10mSec中断

每2毫秒使用一个计时器,并增加一个计数器。 在每一次击球你有2毫秒的事件,每5次击中你也有10毫秒的事件,每50次击中你也有100毫秒的事件。

注意:一般的解决方案是让计时器每1毫秒命中,并有一个超时列表进行比较。 他们并不都必须是对方的倍数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐