信号问题,定时器(SIGEV_SIGNAL)

我有一小段代码,在那里我使用了一个POSIX计时器:timer_create()。 计时器是使用信号方法(SIGEV_SIGNAL)创build的,因为我们的平台不支持SIGEV_THREAD。 当定时器到期时,它产生一个信号SIGUSR1来通知它到期,并且在这个处理程序中有一个对应的处理程序来捕获这个信号(在实际的程序中,在代码中没有显示),我有一个标志,一旦定时器给出的信号被捕获。

直到这一切,一切都很好: 问题是,假设如果testing程序也产生相同的信号作为定时器(在这种情况下SIGUSR1),然后设置相同的标志,而不是定时器。 所以没有办法来区分,信号处理器接收到的信号是定时器还是其他testing程序。

你能帮我解决这个问题吗?

提前致谢。

enter code here #include <stdlib.h> #include <time.h> #include <stdio.h> #include <signal.h> #include <errno.h> #include <string.h> void sig_handlerTimer1(int); time_t timerid; int main() { int i; static struct sigaction sa; static struct sigevent sevp; // argument to timer_create static struct itimerspec its; // argument to timer_gettime memset (&sevp, 0, sizeof (struct sigevent)); sevp.sigev_value.sival_ptr = &timerid; sevp.sigev_notify = SIGEV_SIGNAL; sevp.sigev_notify_attributes = NULL; sevp.sigev_signo = SIGUSR1; sevp.sigev_notify_function=sig_handlerTimer1; /* Setting timer interval */ its.it_interval.tv_sec = 0; its.it_interval.tv_nsec = 0; /* Setting timer expiration */ its.it_value.tv_sec = 2; // First expiry after 1 sec its.it_value.tv_nsec = 0; /* Setting the signal handlers before invoking timer*/ sa.sa_handler = sig_handlerTimer1; sa.sa_flags = 0; sigaction(SIGUSR1, &sa, NULL); if (timer_create(CLOCK_REALTIME, &sevp, &timerid) == -1) { fprintf(stderr, "LeakTracer (timer_trackStartTime): timer_create failed to create timer. " \ "Leak measurement will be for entire duration of the execution period:%s \n", strerror(errno)); return; } if (timer_settime(timerid, 0, &its, NULL) == -1) { fprintf(stderr, "LeakTracer (timer_trackStartTime): timer_settime failed to set the timer. " \ "Leak measurement will be for entire duration of execution period:%s \n", strerror(errno)); return; } for(i=0; i<10; i++) { printf("%d\n",i); if(i==3) { kill(getpid(), SIGUSR1); // SIGUSR1 also generated by test program which reaches same handler and sets flag (THIS IS UN-DESIRABLE) } sleep(1); } } void sig_handlerTimer1(int signum) { int flag = 1; printf("Caught signal: %d\n",signum); // How to understand this signal caught, is that of test program of timer expiry? if (timer_delete(timerid) < 0) { fprintf(stderr, "timer deletion failed. " \ "This may result in some memory leaks (sig_handlerTimer1):%s \n", strerror(errno)); } } 

补充: 一旦信号被捕获,是否有任何方法可以知道计时器是否真的已经过期?

通过安装具有SA_SIGINFO标志的信号处理程序和struct sigactionsa_sigaction成员,然后使用传递给信号处理程序的siginfo_t *si_code元素,可以区分信号的原因。 如果是SI_TIMER那么信号是由定时器到期产生的。

你可能会没问题,因为得到SIGUSR1的唯一方法是自己生成它,或者在进程中,使用kill()系统调用,或者作为定时器消逝的结果,或者从命令行使用kill命令。

还有一个SIGUSR2 ,你可以用于其他目的。

这是几乎相同的问题,正在回答。 在那个解决方案中,他正在设置指向sigval union的指针,你也可以设置任何int值。 该值可以在处理程序中检查,如果值是由您设置的相同,那么这是您的信号。 以下是sigval工会的定义:

 union sigval { int sival_int; void *sival_ptr; }; 

您可以设置seg.sigev_value.sival_int = yourint和处理程序通过比较这种方式检查相同的值:

 if(si->si_value.sival_int == yourint) printf("My event"); else printf("It's not"); 

希望这可以帮助。