← index
cplusplus11.Examples/UNIX/timer/timer.cpp
Source: cplusplus11.Examples/UNIX/timer/timer.cpp
#include<iostream>
#include<signal.h>
#include<sys/time.h>
#include<ctime>
#include<unistd.h>
#include<errno.h>
#include<cstring>


static volatile sig_atomic_t alarmSet = 0;

void timerHandler(int ) {
    alarmSet = 1;
}

int main(void) {
    
    struct itimerval time_val;
    int max_timeouts = 0;
    int timeouts = 0;
    
    struct sigaction sa;
    
    std::cout << "Program will now wait for the timer to send a signal..\n";
    
    timeouts = 0;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    sa.sa_handler = timerHandler;
    if(sigaction(SIGALRM, &sa, NULL) == -1) {
        std::cerr << "Signal Error: " << strerror(errno) << "\n";
        exit(EXIT_FAILURE);
    }
    
    time_val.it_value.tv_sec = 3;
    time_val.it_value.tv_usec = 1;
    time_val.it_interval.tv_sec = 3;
    time_val.it_interval.tv_usec = 1;
    
    max_timeouts = 4;
    if(setitimer(ITIMER_REAL, &time_val, NULL) == -1) {
        std::cerr << "Set Timer Error:" << strerror(errno) << "\n";
        exit(EXIT_FAILURE);
    }
    
    timeouts = 0;
    
    while(1) {
        
        if(alarmSet == 1) {
            alarmSet = 0;
            std::cout << "Alarm went off...\n";
            timeouts++;
            if(timeouts >= max_timeouts) {
                std::cout << "Timers captured..\n";
                exit(EXIT_FAILURE);
            }
        }
        
    }
    
    return 0;
}