cpp中的多个信号使用情况

时间:2016-11-20 13:56:07

标签: c++ networking

参考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,可能是什么错误?

1 个答案:

答案 0 :(得分:0)

只有一个SIGALARM信号处理程序,只有一个ITIMER_REAL计时器。

SIGALARM安装处理程序会删除以前的信号处理程序,并将其替换为新的处理程序。

设置ITIMER_REAL计时器会清除之前设置的所有计时器,并将其替换为新计时器。

显示的代码设置SIGALARM处理程序,并设置ITIMER_REAL计时器。然后,显示再次这样做。

最终结果是只有第二个计时器和信号处理程序仍然有效。只有一个ITIMER_REAL计时器,当它到期时,如上所述,生成SIGALARM信号,并且当时安装的任何信号处理程序都将被调用。

如果你需要为多个超时实现一个框架,每个超时都有一个信号处理程序,你必须自己编写这个框架,就单个计时器和单个信号处理程序而言。