我正在使用timer_create
在Linux中创建计时器。回调原型是:
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
&amp; hBuf
以便我可以在TimerHandlerCB
答案 0 :(得分:3)
你已经在做了:
sigev.sigev_value.sival_ptr = &timerid;
您可以在其中指定任何内容(指定&timerid
在多个计时器之间识别是常见的,但不是必需的)。现在在你的处理程序中:
static void timer_handler(int signo, siginfo_t *si, void *uc)
{
/* si->si_value.sival_ptr */
}
来自TLPI的报价
调用timer_create()时, evp.sigev_value.sival_ptr通常是 分配了timerid的地址 在同一个电话中给出的论点。 或者, evp.sigev_value.sival_ptr可能是 分配了结构的地址 包含给出的timerid timer_create()
答案 1 :(得分:1)
您需要: