#define _GNU_SOURCE 1 #include #include #include #include #include struct timeval max, avg; long numsamples; void interrupt(int sig) { avg.tv_sec /= numsamples; avg.tv_usec /= numsamples; printf("max diff %ld.%ld avgdiff %ld.%ld numsamples %lu\n", max.tv_sec, max.tv_usec, avg.tv_sec, avg.tv_usec, numsamples); exit(0); } void statistics(struct timeval *diff) { if (timercmp(diff, &max, >)) max = *diff; timeradd(diff, &avg, &avg); numsamples++; } int main(void) { static struct timespec onesec = { .tv_sec = 1 }; struct timespec rem = {}; struct timeval last, now, diff; printf("Press Ctrl-c to stop\n"); signal(SIGINT, interrupt); gettimeofday(&last, NULL); for (;;) { nanosleep(&onesec, &rem); if (rem.tv_sec + rem.tv_nsec > 0) printf("remainder %ld.%ld\n", rem.tv_sec, rem.tv_nsec/1000); gettimeofday(&now, NULL); timersub(&now, &last, &diff); statistics(&diff); printf("%ld.%ld\n", diff.tv_sec, diff.tv_usec); last = now; } return 0; }