#include <stdio.h> #include <time.h> #include <sys/timex.h> #include <stdlib.h> #include <stdint.h> #include <err.h> #include <unistd.h> #ifndef NANOSECOND #define NANOSECOND 1000000000L #endif static void show_ts(const char *str, struct timespec *ts) { printf("%s={tv_sec=%jd, tv_nsec=%ld}\n", str, (intmax_t)ts->tv_sec, ts->tv_nsec); } int main(int argc, char **argv) { struct timespec tv1, tv2; struct timespec ts1, ts2; long delta; long nsec_delay; nsec_delay = 1000000L; if (argc > 1) nsec_delay = atoi(argv[1]) * 1000L; clock_getres(CLOCK_MONOTONIC, &ts1); show_ts("res", &ts1); if (nsec_delay < ts1.tv_nsec) err(1, "delay %ld < resolution %ld", nsec_delay, ts1.tv_nsec); ts1.tv_sec = nsec_delay / NANOSECOND; ts1.tv_nsec = nsec_delay % NANOSECOND; clock_gettime(CLOCK_MONOTONIC, &tv1); clock_nanosleep(CLOCK_MONOTONIC, 0, &ts1, &ts2); clock_gettime(CLOCK_MONOTONIC, &tv2); delta = (tv2.tv_sec - tv1.tv_sec) * NANOSECOND + (tv2.tv_nsec - tv1.tv_nsec); show_ts("tv1", &tv1); show_ts("tv2", &tv2); show_ts("ts1", &ts1); show_ts("ts2", &ts2); printf("nsec_delay: %ld delta: %ld\n", nsec_delay, delta); return 0; }