c信号处理程序

时间:2015-08-10 12:12:58

标签: c signals

我正在编写一个应用程序,我希望每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。

由于

1 个答案:

答案 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}}字段中指定了空信号掩码,进入处理程序时也会阻止捕获的信号并在离开时取消阻止。