Interval timers on Fedora

Douglas Phillipson phillipd at oem.doe.gov
Fri Aug 4 19:31:12 UTC 2006


John Wendel wrote:

>>
> 
> I'm not an expert on this stuff, but my understanding is that setitimer 
> gives your process access to one of three predefined timers (REAL, 
> VIRTUAL, and PROF) and only the REAL timer is actually useful.
> So your second call to setitimer is mucking up the settings from the 
> first call.
> 
> See "man timer_create" for the POSIX timer stuff that lets you have lots 
> of timers.
> 
> I recommend the O'REILLY book POSIX 4 by Bill Gallmeister for a good 
> explanation of this fairly complicated topic.
> 
> Regards,
> 
> John
> 

I just tried the following experiment and it worked fine with 4 timers! 
  I must be doing something stupid in my other code...

#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <signal.h>
#include <sys/time.h>


void catch_signal1(int ignored);
void catch_signal2(int ignored);
void catch_signal3(int ignored);
void catch_signal4(int ignored);

void catch_signal1 (int ignored) {
    fprintf(stderr,"Timer 1 caught...\n");
}

void catch_signal2 (int ignored) {
    fprintf(stderr,"Timer 2 caught...\n");
}

void catch_signal3 (int ignored) {
    fprintf(stderr,"Timer 3 caught...\n");
}
void catch_signal4 (int ignored) {
    fprintf(stderr,"Timer 4 caught...\n");
}

main(int argc, char **argv) {

    start_timer1(1,catch_signal1);
    start_timer1(2,catch_signal2);
    start_timer1(3,catch_signal3);
    start_timer1(8,catch_signal4);
    while(1) {
       pause();
    }

}

pid_t start_timer1 (int interval, void(*func)(void)) {
     pid_t child;
     struct itimerval it;
     struct sigaction sa;


     if (!(child = fork())) {
         memset(&sa, 0, sizeof(sa));
         sa.sa_handler = func;
         sigemptyset(&sa.sa_mask);
         sa.sa_flags = SA_RESTART;

         sigaction(SIGALRM, &sa, NULL);
         memset(&it, 0, sizeof(it));
         it.it_interval.tv_sec = interval;
         it.it_value.tv_sec = interval;
         setitimer(ITIMER_REAL, &it, NULL);

         while (1) {
             pause();
         }
     }

     return child;
}




More information about the fedora-list mailing list