问题描述
我一直在使用timer_create()API实现POSIX计时器,当计时器到期了,我已经把处理器code这将产生SIGUSR1。现在的问题是,如果这个计划得到另一个SIGUSR1,那么相同的信号处理程序将被调用,并且抓住了。
I have implemented a POSIX timer using timer_create( ) API, and this will generate SIGUSR1 when the timer expires for which i have put a handler code. Now the problem is, if this program receives another SIGUSR1, then the same signal handler will be invoked and caught.
有什么办法prevent这一点,所以,处理程序可以捕获仅由定时器产生的信号?
Is there any way to prevent this, so that the handler can catch signals only generated by the timer?
推荐答案
这是否会为你工作? (修改自例如code在 timer_create
手册页。)
Will this work for you? (Modified the code from example in timer_create
man page.)
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
#define CLOCKID CLOCK_REALTIME
#define SIG SIGUSR1
timer_t timerid;
static void handler(int sig, siginfo_t *si, void *uc)
{
if(si->si_value.sival_ptr != &timerid){
printf("Stray signal\n");
} else {
printf("Caught signal %d from timer\n", sig);
}
}
int main(int argc, char *argv[])
{
struct sigevent sev;
struct itimerspec its;
long long freq_nanosecs;
sigset_t mask;
struct sigaction sa;
printf("Establishing handler for signal %d\n", SIG);
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = handler;
sigemptyset(&sa.sa_mask);
sigaction(SIG, &sa, NULL);
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIG;
sev.sigev_value.sival_ptr = &timerid;
timer_create(CLOCKID, &sev, &timerid);
/* Start the timer */
its.it_value.tv_sec = 10;
its.it_value.tv_nsec = 0;
its.it_interval.tv_sec = its.it_value.tv_sec;
its.it_interval.tv_nsec = its.it_value.tv_nsec;
timer_settime(timerid, 0, &its, NULL);
sleep(100);
exit(EXIT_SUCCESS);
}
当从定时器信号被捕获从夹缝定时器信号10
将被显示。否则杂散信号
将被显示。
When signal from timer is caught Caught signal 10 from timer
will be displayed. Otherwise Stray signal
will be displayed.
这篇关于问题计时器和信号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!