2011-05-10 63 views
3

我正在使用timer_create在Linux中创建计时器。回调原型:使用timer_create传递用户数据

static void TimerHandlerCB(int sig, siginfo_t *extra, void *cruft) 

如何传递用户数据,这样我可以在定时器超时后调用的回调收到相同。

这里是我的示例代码:

int RegisterTimer(iDiffInTime) 
{ 
    struct sigaction sa; 
    sigemptyset(&sa.sa_mask); 
    sa.sa_flags = SA_SIGINFO; /*call our handler*/ 
    sa.sa_sigaction = TimerHandlerCB;/*Event handler to be called after timer expires*/ 
    if(sigaction(SIGRTMAX, &sa, NULL) < 0) 
    { 
     perror("sigaction"); 
     return 1; 
    } 
    // Setup the timer 
    sigevent sigev; 
    timer_t timerid = 0; 

    memset(&sigev, 0, sizeof(sigev)); 

    sigev.sigev_notify   = SIGEV_SIGNAL; 
    sigev.sigev_signo   = SIGRTMAX; 
    sigev.sigev_value.sival_ptr = &timerid; 

    timer_t timerid; 

    if (timer_create(CLOCK_REALTIME, &sigev, &timerid) == 0) 
    { 
     printf("Timer created\n"); 
     struct itimerspec itval, oitval; 

     itval.it_value.tv_sec = iDiffInTime * 1000; 
     itval.it_value.tv_nsec = 0; 
     itval.it_interval.tv_sec = 0; 
     itval.it_interval.tv_nsec = 0; 

       //Populate handles required in TimerCallback 
       Display_Handle hDisplay = ......// 
       Buffer_Handle hBuf = .....// 
     if (timer_settime(timerid, 0, &itval, &oitval) != 0) 
     { 
      perror("time_settime error!"); 
      return 1; 
     } 
    } 
    else 
    { 
     perror("timer_create error!"); 
    } 
    return 0 
} 

从哪里传hDisplay & hBuf,这样我可以接受他们回到TimerHandlerCB

+0

C或C++的的timerId结构 的地址?选一个。 – 2011-05-10 09:05:50

+0

@Tomalak Geret'kal:它是一个带有程序C++的遗留代码;) – 2011-05-10 09:16:13

+0

将'.sival_ptr'设置为局部变量的地址可能不是一个好主意。 – PSkocik 2017-11-14 17:27:03

回答

3

你已经在做了:

sigev.sigev_value.sival_ptr = &timerid; 

你可以指定任何内容(指定&timerid是通常在多个定时器之间辨别,但不是必需的)。现在,在你的处理器:从TLPI

static void timer_handler(int signo, siginfo_t *si, void *uc) 
{ 
    /* si->si_value.sival_ptr */ 
} 

报价在调用timer_create(), evp.sigev_value.sival_ptr通常 分配在同一个呼叫给出的timerId 参数的地址。 或者, evp.sigev_value.sival_ptr可以 分配包含给予 timer_create()

+0

谢谢这就是我需要:) – 2011-05-10 09:56:56

1

您需要:

  • 添加全局变量,并使用一些同步机制就像信号灯
  • 使用sigqueue