简体   繁体   中英

Multiple Signal usage in cpp

with reference to this , I have included two timers (it_val1, it_val) in setTimer() in my program as below:

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();
}

But only it_val is triggered upon execution and not it_val1, what could be the error?

There's only one SIGALARM signal handler, and only one ITIMER_REAL timer.

Installing a handler for a SIGALARM removes the previous signal handler, and replaces it with a new one.

Setting the ITIMER_REAL timer clears any previously set timer, and replaces it with a new one.

The shown code sets the SIGALARM handler, and sets the ITIMER_REAL timer. Then, the shown does this again.

The final result is that only the second timer and signal handler remains in effect. There's only one ITIMER_REAL timer, and when it expires, as described, a SIGALARM signal is generated, and whatever signal handler that's installed at that time, is the one that will be invoked.

If you need to implement a framework for multiple timeouts, with a signal handler for each one, you will have to write this framework yourself, in terms of a single timer, and a single signal handler.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM