参考this,我在程序中的setTimer()中包含了两个计时器(it_val1,it_val),如下所示:
void stepRoutingTable(){
}
void incrementCounter(){
}
void setTimer(){
struct itimerval it_val1;
if (signal(SIGALRM, (void (*)(int)) incrementCounter) == SIG_ERR) {
cerr<<"Unable to catch SIGALRM"<<endl;
exit(1);
}
it_val1.it_value.tv_sec = updateInterval;
it_val1.it_value.tv_usec = (updateInterval) % 1000000;
it_val1.it_interval = it_val1.it_value;
if (setitimer(ITIMER_REAL, &it_val1, NULL) == -1) {
cerr<<"error calling setitimer()";
exit(1);
}
struct itimerval it_val;
if (signal(SIGALRM, (void (*)(int)) stepRoutingTable) == SIG_ERR) {
cerr<<"Unable to catch SIGALRM"<<endl;
exit(1);
}
it_val.it_value.tv_sec = updateInterval;
it_val.it_value.tv_usec = (updateInterval) % 1000000;
it_val.it_interval = it_val.it_value;
if (setitimer(ITIMER_REAL, &it_val, NULL) == -1) {
cerr<<"error calling setitimer()";
exit(1);
}
return;
}
int main(int argc, char* ipCmd[]){
updateInterval=100;
setTimer();
}
但是只有it_val在执行时触发而不是it_val1,可能是什么错误?
答案 0 :(得分:0)
只有一个SIGALARM
信号处理程序,只有一个ITIMER_REAL
计时器。
为SIGALARM
安装处理程序会删除以前的信号处理程序,并将其替换为新的处理程序。
设置ITIMER_REAL
计时器会清除之前设置的所有计时器,并将其替换为新计时器。
显示的代码设置SIGALARM
处理程序,并设置ITIMER_REAL
计时器。然后,显示再次这样做。
最终结果是只有第二个计时器和信号处理程序仍然有效。只有一个ITIMER_REAL
计时器,当它到期时,如上所述,生成SIGALARM
信号,并且当时安装的任何信号处理程序都将被调用。
如果你需要为多个超时实现一个框架,每个超时都有一个信号处理程序,你必须自己编写这个框架,就单个计时器和单个信号处理程序而言。