// Ivan Novick // November 26, 2009 // example code to set a timer using setitimer and catch the SIGALRM with a handler #include #include #include #include void alarm_handler(int signum){ // not a great idea to call system calls inside signal handlers fprintf(stdout, "alarm_handler\n"); fflush(stdout); } int main(int argc, char** argv){ struct sigaction new_action; new_action.sa_handler = alarm_handler; sigemptyset (&new_action.sa_mask); new_action.sa_flags = 0; if (sigaction(SIGALRM, &new_action, NULL) < 0){ fprintf(stderr, "setting SIGALRM handler failed\n"); exit(1); } struct itimerval timerval; timerval.it_value.tv_sec = 10; timerval.it_value.tv_usec = 0; // first sleep is 10 seconds timerval.it_interval.tv_sec = 4; timerval.it_interval.tv_usec = 0; // renewal sleeps are 4 seconds if (setitimer(ITIMER_REAL, &timerval, NULL) < 0){ fprintf(stderr, "setting timer failed\n"); exit(1); } int slept = 0; while (1){ sleep(1); fprintf(stdout, "slept %d sec\n", ++slept); fflush(stdout); } return 0; }