title: POSIX TIMER- Have multiple timers
body: <p>I am trying to have two timers in my system for two different purpose but I dont understand why it doesnt work. Can somebody help me?Also, Should the handler code be a bare minumum so the tasks themselves dont interfere with the tick? Also can I define separate handler?</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  #include &lt;unistd.h&gt;
  #include &lt;signal.h&gt;
  #include &lt;netinet/in.h&gt;
  #include &lt;linux/socket.h&gt;
  #include &lt;time.h&gt;
  
  
  #define SIGTIMER (SIGRTMAX)
  #define SIG SIGUSR1
  static timer_t     tid;
  static timer_t     tid2;
  
  void SignalHandler(int, siginfo_t*, void* );
  timer_t SetTimer(int, int, int);
  
  int main(int argc, char *argv[]) {
  
  
      struct sigaction sigact;
      sigemptyset(&amp;sigact.sa_mask);
      sigact.sa_flags = SA_SIGINFO;
      sigact.sa_sigaction = SignalHandler;
      // set up sigaction to catch signal
      if (sigaction(SIGTIMER, &amp;sigact, NULL) == -1) {
          perror("sigaction failed");
          exit( EXIT_FAILURE );
      }
  
      // Establish a handler to catch CTRL+c and use it for exiting.
      sigaction(SIGINT, &amp;sigact, NULL);
      tid=SetTimer(SIGTIMER, 1000, 1);
  
      struct sigaction sa;
      sigemptyset(&amp;sa.sa_mask);
      sa.sa_flags = SA_SIGINFO;
      sa.sa_sigaction = SignalHandler;
      // set up sigaction to catch signal
      if (sigaction(SIG, &amp;sa, NULL) == -1) {
          perror("sa failed");
          exit( EXIT_FAILURE );
      }
  
      // Establish a handler to catch CTRL+c and use it for exiting.
      sigaction(SIGINT, &amp;sa, NULL);
      tid2=SetTimer(SIG, 1000, 3);
      for(;;);
      return 0;
  }
  
  void SignalHandler(int signo, siginfo_t* info, void* context)
  {
      if (signo == SIGTIMER) {
          printf("Command Caller has ticked\n");
  
      }else if (signo == SIG) {
          printf("Data Caller has ticked\n");
  
      } else if (signo == SIGINT) {
          timer_delete(tid);
          perror("Crtl+c cached!");
          exit(1);  // exit if CRTL/C is issued
      }
  }
  timer_t SetTimer(int signo, int sec, int mode)
  {
      static struct sigevent sigev;
      static timer_t tid;
      static struct itimerspec itval;
      static struct itimerspec oitval;
  
      // Create the POSIX timer to generate signo
      sigev.sigev_notify = SIGEV_SIGNAL;
      sigev.sigev_signo = signo;
      sigev.sigev_value.sival_ptr = &amp;tid;
  
      if (timer_create(CLOCK_REALTIME, &amp;sigev, &amp;tid) == 0) {
          itval.it_value.tv_sec = sec / 1000;
          itval.it_value.tv_nsec = (long)(sec % 1000) * (1000000L);
  
          if (mode == 1) {
              itval.it_interval.tv_sec = itval.it_value.tv_sec;
              itval.it_interval.tv_nsec = itval.it_value.tv_nsec;
          }
          else {
              itval.it_interval.tv_sec = 0;
              itval.it_interval.tv_nsec = 0;
          }
  
          if (timer_settime(tid, 0, &amp;itval, &amp;oitval) != 0) {
              perror("time_settime error!");
          }
      }
      else {
          perror("timer_create error!");
          return NULL;
      }
      return tid;
  }
  </code></pre>