Most POSIX-compatible systems provide a function to get or set one of the high-resolution timers:
int clock_gettime(clockid_t clock_id, struct timespec *tp);
The documentation for each system usually lists several symbolic names as possible values clock_id, but the actual numerical values are never mentioned. It turns out that not only the numerical values are different for different systems, but the symbolic names are also not the same for the same value. Moreover, not all clocks actually supported by the system are defined in .h time (bits / time.h) - some of them are determined only by, say, linux / time.h.
That is, on a Linux system, we can:
#define CLOCK_REALTIME 0
#define CLOCK_MONOTONIC 1
#define CLOCK_PROCESS_CPUTIME_ID 2
#define CLOCK_THREAD_CPUTIME_ID 3
#define CLOCK_MONOTONIC_RAW 4
#define CLOCK_REALTIME_COARSE 5
#define CLOCK_MONOTONIC_COARSE 6
#define CLOCK_BOOTTIME 7
#define CLOCK_REALTIME_ALARM 8
#define CLOCK_BOOTTIME_ALARM 9
#define CLOCK_SGI_CYCLE 10
#define CLOCK_TAI 11
In a Cygwin environment (and not as an excerpt):
#define CLOCK_REALTIME 1
#define CLOCK_MONOTONIC 4
#define CLOCK_PROCESS_CPUTIME_ID 2
#define CLOCK_THREAD_CPUTIME_ID 3
In FreeBSD:
#define CLOCK_REALTIME 0
#define CLOCK_VIRTUAL 1
#define CLOCK_PROF 2
#define CLOCK_MONOTONIC 4
#define CLOCK_UPTIME 5
#define CLOCK_UPTIME_PRECISE 7
#define CLOCK_UPTIME_FAST 8
#define CLOCK_REALTIME_PRECISE 9
#define CLOCK_REALTIME_FAST 10
#define CLOCK_MONOTONIC_PRECISE 11
#define CLOCK_MONOTONIC_FAST 12
#define CLOCK_SECOND 13
#define CLOCK_THREAD_CPUTIME_ID 14
#define CLOCK_PROCESS_CPUTIME_ID 15
On AIX:
#define CLOCK_REALTIME ...
#define CLOCK_MONOTONIC ...
#define CLOCK_PROCESS_CPUTIME_ID ...
#define CLOCK_THREAD_CPUTIME_ID ...
In SunOS:
#define CLOCK_REALTIME ...
#define CLOCK_HIGHRES ...
In QNX:
#define CLOCK_REALTIME ...
#define CLOCK_SOFTTIME ...
#define CLOCK_MONOTONIC ...
Etc.
, clock_gettime() , CLOCK_REALTIME, . , CLOCK_MONOTONIC_COARSE CLOCK_BOOTTIME, , BSD CLOCK_MONOTONIC_FAST CLOCK_UPTIME, ?
, 4 ? :
#define POSIX_CLOCK_REALTIME 0
#define POSIX_CLOCK_MONOTONIC 1
#define POSIX_CLOCK_PROCESS_CPUTIME_ID 2
#define POSIX_CLOCK_THREAD_CPUTIME_ID 3
#define POSIX_CLOCK_MONOTONIC_RAW 4
#if CLOCK_REALTIME == POSIX_CLOCK_MONOTONIC
#warning This platform has monotonic realtime clock.
#end if
#if CLOCK_MONOTONIC == POSIX_CLOCK_MONOTONIC_RAW
#warning This platform has undisciplined monotonic clock.
#end if
CLOCK_TAI, . h, , , 11 CLOCK_MONOTONIC_PRECISE - ?