#define _XOPEN_SOURCE	600
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/time.h>
#include <time.h>
#include <errno.h>

void sighandler(int sig, siginfo_t *info, void *ctxt)
{
  // Use of printf() inside signal handlers is ill advised.
  printf("Caught: %d\n", sig);
  if (sig == SIGALRM) printf("Alarm: %d\n", *(timer_t *)(info->si_value.sival_ptr));
  if (sig == SIGINT) exit(0);
}

int main(void)
{
  struct sigaction act;
  struct itimerval timer;
  struct sigevent sevp;
  struct itimerspec its;
  timer_t tid;
  int i;

  act.sa_sigaction = &sighandler;
  act.sa_flags = SA_SIGINFO;
  for(i=0; i < 32; i++)
    sigaction(i, &act, NULL);

  timer.it_interval.tv_sec = 1;
  timer.it_interval.tv_usec = 0;
  timer.it_value.tv_sec = 1;
  timer.it_value.tv_usec = 0;

  setitimer(ITIMER_REAL, &timer, NULL);


  sevp.sigev_notify = SIGEV_SIGNAL;
  sevp.sigev_signo = SIGALRM;
  sevp.sigev_value.sival_ptr = &tid;
  timer_create(CLOCK_REALTIME, &sevp, &tid);
  printf("Created timer: %d\n", tid);

  long freq_nanosecs = 2000000000;
  its.it_value.tv_sec = freq_nanosecs / 1000000000;
  its.it_value.tv_nsec = freq_nanosecs % 1000000000;
  its.it_interval.tv_sec = its.it_value.tv_sec;
  its.it_interval.tv_nsec = its.it_value.tv_nsec;

  if (timer_settime(tid, 0, &its, NULL) == -1)
     perror("timer_settime");

  while(1) pause();

  return 0;
}
