struct timeval { time_t tv_sec; suseconds_t tv_usec; };
The tv_sec member represents the elapsed time, in whole seconds. The tv_usec member captures rest of the elapsed time, represented as the number of microseconds.
struct timespec { time_t tv_sec; long tv_nsec; };
The tv_sec member is again the elapsed time in whole seconds. The tv_nsec member represents the rest of the elapsed time in nanoseconds.
A microsecond is equal to one millionth of a second, 1000 nanoseconds, or 1/1000 milliseconds. To ease the conversions, the macros Fn TIMEVAL_TO_TIMESPEC and Fn TIMESPEC_TO_TIMEVAL can be used to convert between struct timeval and struct timespec
static void example(struct timespec *spec, time_t minutes) { struct timeval elapsed; (void)gettimeofday(&elapsed, NULL); _DIAGASSERT(spec != NULL); TIMEVAL_TO_TIMESPEC(&elapsed, spec); /* Add the offset for timeout in minutes. */ spec->tv_sec = spec->tv_sec + minutes * 60; }
A better alternative would use the more precise clock_gettime2.