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

时间:2014-02-27 09:30:24

标签: c++ c linux timer udp

/ *处理程序检查存储在sival_ptr中的值是否与给定的timerID匹配 变量。 sival_ptr与我们在makeTimer()中设置的相同, 虽然在这里它生活在一个不同的结构。 显然,它已经从那里复制到了这个信号处理程序的路上。 关键是timerID是用于确定哪个计时器刚刚关闭的内容 并确定下一步做什么* /

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_t变量的指针,该变量将被填充 timer_create()创建的计时器ID。该指针也保存在sival_ptr中 在调用timer_create()之前调用变量。在这个函数中注意我们 始终使用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, 0, &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调用任务。我使用多个定时器与单信号处理程序。如何识别哪个计时器。在调试模式下:最后一个调试控制会话是:static void timerHandler(int sig,siginfo_t * si,void * uc){。任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

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

注意:一般的解决方案是让计时器每1毫秒命中一次,并有一个超时列表进行比较。它们并非都是彼此的倍数。