0

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?

Community
  • 1
  • 1
Anurag D
  • 11
  • 1

1 Answers1

0

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.

Sam Varshavchik
  • 114,536
  • 5
  • 94
  • 148