This is the code below: May be not well written but you can identify if there are any issues…
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <iostream>
#include <cstdlib>
#define CLOCKID CLOCK_REALTIME
#define SIG SIGRTMIN
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); } while (0)
timer_t timerid;
struct itimerspec last_itimer;
struct itimerspec current_itimer;
struct itimerspec diff_itimer;
struct timespec res_itimer;
struct timeval last_time;
struct timeval curr_time;
long long int counter = 0;
static double reps = 0.0;
double diff = 0.0;
double freq_sum = 0.0;
double freq_min = 99999.0;
double freq_max = 0.0;
long long int num_too_low = 0;
static void
handler(int sig, siginfo_t *si, void *uc)
{
/* Note: calling printf() from a signal handler is not
strictly correct, since printf() is not async-signal-safe;
see signal(7) */
++counter;
if(counter >= 1000)
{
++reps;
if( timer_gettime(timerid, ¤t_itimer) != 0)
printf ("crash");
printf("looks like its a second, %d ", timer_getoverrun(timerid));
printf("tv_sec last: %d , curernt: %d , diff: %d ", last_itimer.it_value.tv_sec, current_itimer.it_value.tv_sec, (current_itimer.it_value.tv_sec - last_itimer.it_value.tv_sec));
printf("tv_nsec last: %d , curernt: %d , diff: %d
", last_itimer.it_value.tv_nsec, current_itimer.it_value.tv_nsec, (current_itimer.it_value.tv_nsec - last_itimer.it_value.tv_nsec));
last_itimer = current_itimer;
counter = 0;
}
}
int
main(int argc, char *argv])
{
//timer_t timerid;
struct sigevent sev;
struct itimerspec its;
long long freq_nanosecs;
sigset_t mask;
struct sigaction sa;
/* Establish handler for timer signal */
printf("Establishing handler for signal %d
", SIG);
sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = handler;
sigemptyset(&sa.sa_mask);
if (sigaction(SIG, &sa, NULL) == -1)
errExit("sigaction");
/* Create the timer */
sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIG;
sev.sigev_value.sival_ptr = &timerid;
if (timer_create(CLOCKID, &sev, &timerid) == -1)
errExit("timer_create");
printf("timer ID is 0x%lx
", (long) timerid);
/* Start the timer */
its.it_value.tv_sec = 0;
its.it_value.tv_nsec = 1000000;
printf("its.it_value.tv_sec: %d
", its.it_value.tv_sec);
printf("its.it_value.tv_nsec: %d
", its.it_value.tv_nsec);
its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = 1000000;
if (timer_settime(timerid, 0, &its, NULL) == -1)
errExit("timer_settime");
clock_getres(CLOCKID, &res_itimer);
printf("Clock resolution - sec: %d ", res_itimer.tv_sec);
printf("nsec: %d
", res_itimer.tv_nsec);
/* Sleep for a while; meanwhile, the timer may expire multiple times */
while(reps <= 30.0)
{
sleep(1);
}
exit(EXIT_SUCCESS);
}
And this is output when i compile it with g++ -lrt -o
and run using
./
the output appears to be every second… but ,…
Establishing handler for signal 34
timer ID is 0x804b008
its.it_value.tv_sec: 0
its.it_value.tv_nsec: 1000000
Clock resolution - sec: 0 nsec: 1
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 0 , curernt: 988307 , diff: 988307
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 988307 , curernt: 976078 , diff: -12229
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 976078 , curernt: 986469 , diff: 10391
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 986469 , curernt: 910381 , diff: -76088
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 910381 , curernt: 990134 , diff: 79753
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 990134 , curernt: 986030 , diff: -4104
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 986030 , curernt: 986349 , diff: 319
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 986349 , curernt: 990956 , diff: 4607
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 990956 , curernt: 990215 , diff: -741
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 990215 , curernt: 991776 , diff: 1561
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 991776 , curernt: 991923 , diff: 147
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 991923 , curernt: 926336 , diff: -65587
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 926336 , curernt: 912838 , diff: -13498
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 912838 , curernt: 991112 , diff: 78274
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 991112 , curernt: 991231 , diff: 119
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 991231 , curernt: 986628 , diff: -4603
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 986628 , curernt: 991195 , diff: 4567
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 991195 , curernt: 991163 , diff: -32
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 991163 , curernt: 991016 , diff: -147
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 991016 , curernt: 988656 , diff: -2360
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 988656 , curernt: 990801 , diff: 2145
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 990801 , curernt: 990767 , diff: -34
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 990767 , curernt: 991837 , diff: 1070
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 991837 , curernt: 991886 , diff: 49
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 991886 , curernt: 990674 , diff: -1212
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 990674 , curernt: 912867 , diff: -77807
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 912867 , curernt: 990602 , diff: 77735
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 990602 , curernt: 991561 , diff: 959
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 991561 , curernt: 987454 , diff: -4107
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 987454 , curernt: 990754 , diff: 3300
looks like its a second, 0 tv_sec last: 0 , curernt: 0 , diff: 0 tv_nsec last: 990754 , curernt: 990528 , diff: -226
please advice if i am doing something wrong and how it should work …
Reasons that i think it is not good enough that ,… when i change values for
its.it_value.tv_sec = 0;
its.it_value.tv_nsec = 1000000;
its.it_interval.tv_sec = 0;
its.it_interval.tv_nsec = 1000000;
to some other value i.e. 1000000 to 1000 it stops displaying anything and this is also true for various other values i.e. if i change sec to other than zero…
SOS!!! 