我正在编写一个应用程序,我希望每1秒调用一次函数。这是我到目前为止所写的
Timerspec.it_interval.tv_sec=1;
Timerspec.it_interval.tv_nsec=0;
Timerspec.it_value.tv_sec=1;
Timerspec.it_value.tv_nsec=0;
timer_t timerId;
struct sigaction sa
sa.sa_handler=&TimerFn;
sigaction(SIGALRM,&sa,NULL);
timer_create(CLOCK_REALTIME,NULL,&timerId);
timer_settime(timerId,0,(const itimerspec*)Timerspec,NULL);
如果我的定时器功能(TimerFn)需要1秒以上才能完成,那么在处理程序运行时如何忽略SIGALRM信号。请注意我希望仅在处理程序运行时才忽略信号。如果处理程序未运行,则应调用TimerFn。
由于
答案 0 :(得分:1)
如评论中所述,信号在进入处理程序之前被原子阻塞(除非使用SA_NODEFER
),并且在从处理程序返回后解除阻塞,因此您无需做任何事情。
您声明和使用sa
的方式有问题:您需要至少将sa_flags
字段初始化为0,并且需要将sa_mask
字段初始化为空信号集:
struct sigaction sa;
sa.sa_handler = &TimerFn;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
sigaction(SIGALRM,&sa,NULL);
请注意,即使您在sa_mask
的{{1}}字段中指定了空信号掩码,进入处理程序时也会阻止捕获的信号并在离开时取消阻止。