  
#include <stdio.h>
#include <sys/time.h>
#include <signal.h>
  

// REFERENCE:
//    http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_19.html
//    http://www.cplusplus.com/reference/clibrary/
//

//int print_my_time(int signo);


void wakeup(int signo)
{
printf("alert woken me up\n");
sleep(3);  //delší sleepem "zaměstnáme procesor" a alert přijde znovu. Jinak by skočil zpátky za "setitimer()"
printf("sleep stop\n");

}


int
main(){
  
  //memset( &sa, 0, sizeof(sa));   // Zero-ing memory of sa
  
  printf("start\n");
  
  struct itimerval timer;
  struct sigaction sa; //http://www.delorie.com/gnu/docs/glibc/libc_484.html
  
  sa.sa_handler = wakeup; //handler funkce -- je jedno jestli před tím & nebo ne
  sa.sa_flags = SA_RESTART;
  sigaction (SIGALRM, &sa, NULL);
          // for a reason
          
  timer.it_value.tv_sec=2;
  timer.it_value.tv_usec=0;
  timer.it_interval.tv_sec=2;
  timer.it_interval.tv_usec=0;
  setitimer(ITIMER_REAL, &timer, NULL);
  
  printf("sleep\n");
  sleep(100); //něco provádíme, takže timer se zavolá a "tento sleep se interruptne?"
  printf("end\n");
}


/*

//http://www.sallyx.org/sally/c/c20.php
#define MAX 80
int print_my_time(int signo)
{
    time_t cas;
    //* jestli pracujete se strukturou tm nebo ukazatelem na tuto strukturu,
    //* to je vcelku jedno, ukazu oboji.
    struct tm gtmcas;
    struct tm *ltmcas;
    char retezec[MAX];

    cas = time(NULL);

    gtmcas = *(gmtime(&cas));
    ltmcas = localtime(&cas);

    //* vsimnete si, ze retezec vraceny funkcemi ctime a asctime je jednak
    //* v anglictine a take na konci ukoncen znakem '\n' (coz je v praxi tak
    //* trochu neprijemne, ze). Vyrazi LC a UTC nam kvuli tomu prejdou az na
    //* dalsi radek 
    printf("Je prave \"%s\" LC\n", ctime(&cas));
    printf("Je prave \"%s\" GMT\n", asctime(&gtmcas));
    printf("Je prave \"%s\" LC\n", asctime(ltmcas));

    strftime(retezec, MAX - 1, "Je prave %A %d.%m.%Y, %I:%M %p LC",
             ltmcas);
    printf("%s\n", retezec);
    printf("Tm(LC): %02i.%02i.%04i\n", ltmcas->tm_wday, ltmcas->tm_mon,
           ltmcas->tm_year + 1900);
    cas = (time_t) 0;
    printf("Pocatek vseho je %s", ctime(&cas));

    return 0;
}



//() http://forums.freebsd.org/showthread.php?t=2505
//http://www.kiv.zcu.cz/~luki/vyuka/stare-materialy/os/oslinux/2.0.31/pulc4/alarm.html
unsigned int sys_alarm(unsigned int seconds)
{
        struct itimerval it_new, it_old;
        unsigned int oldalarm;
        it_new.it_interval.tv_sec = it_new.it_interval.tv_usec = 0;
        it_new.it_value.tv_sec = seconds;
        it_new.it_value.tv_usec = 0;
        setitimer(ITIMER_REAL, & it_new,& it_old);
        oldalarm = it_old.it_value.tv_sec;

        if (it_old.it_value.tv_usec)
                oldalarm++;
        return oldalarm;
}

*/


