大多数POSIX兼容系统提供了获取或设置高分辨率定时器之一的功能:
int clock_gettime(clockid_t clock_id, struct timespec *tp);
每个系统的文档通常会列出几个符号名称作为可能的clock_id
值,但从未提及实际数值。事实证明,不仅各种系统的数值都不同,但符号名称对于相同的含义也不相同。更重要的是,并非系统实际支持的所有时钟都在 time.h ( bits / time.h )中定义 - 有些只是定义在,比方说, 的linux / time.h中
也就是说,在我们可能拥有的Linux系统中:
#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 // In linux/time.h only.
#define CLOCK_TAI 11 // In linux/time.h only.
在Cygwin环境中(不是逐字摘录):
#define CLOCK_REALTIME 1 // Means CLOCK_MONOTONIC?
#define CLOCK_MONOTONIC 4 // Means CLOCK_MONOTONIC_RAW?
#define CLOCK_PROCESS_CPUTIME_ID 2
#define CLOCK_THREAD_CPUTIME_ID 3
在FreeBSD中:
#define CLOCK_REALTIME 0
#define CLOCK_VIRTUAL 1
#define CLOCK_PROF 2
#define CLOCK_MONOTONIC 4
#define CLOCK_UPTIME 5 // Synonymous to CLOCK_BOOTTIME?
#define CLOCK_UPTIME_PRECISE 7
#define CLOCK_UPTIME_FAST 8
#define CLOCK_REALTIME_PRECISE 9 // Same as CLOCK_REALTIME?
#define CLOCK_REALTIME_FAST 10 // Synonymous to CLOCK_REALTIME_COARSE?
#define CLOCK_MONOTONIC_PRECISE 11 // Same as CLOCK_MONOTONIC?
#define CLOCK_MONOTONIC_FAST 12 // Synonymous to CLOCK_MONOTONIC_COARSE?
#define CLOCK_SECOND 13
#define CLOCK_THREAD_CPUTIME_ID 14
#define CLOCK_PROCESS_CPUTIME_ID 15
在AIX中:
#define CLOCK_REALTIME ...
#define CLOCK_MONOTONIC ...
#define CLOCK_PROCESS_CPUTIME_ID ...
#define CLOCK_THREAD_CPUTIME_ID ...
在SunOS中:
#define CLOCK_REALTIME ...
#define CLOCK_HIGHRES ... // Synonymous to CLOCK_MONOTONIC_RAW?
在QNX中:
#define CLOCK_REALTIME ...
#define CLOCK_SOFTTIME ...
#define CLOCK_MONOTONIC ...
等等。
这让我想知道如何以可移植的方式将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
但未在 time.h 中定义它,我该如何检查和使用它,同时考虑到相同的数值11可能代表CLOCK_MONOTONIC_PRECISE
或其他系统中的其他内容?
答案 0 :(得分:0)
如果我正在尝试编写一个最大程度可移植的程序,我会将自己限制在相关标准中定义的符号值。 (根据你的说法,它听起来像CLOCK_REALTIME
- 也许只有那个值 - 是标准的。)
如果某些系统实现了我想要使用的有用扩展,我会通过说
来测试它们#ifdef CLOCK_MONOTONIC_COARSE
... my code calling clock_gettime(CLOCK_MONOTONIC_COARSE, &ts) ...
#endif
如果真的存在那些相同的符号值最终意味着截然不同的系统,我会举起手来宣称这是一个可携带的噩梦,那种我,至少,尽量远离。
在回答你的其他问题时,(1)不,对符号值做出假设是不明智的,(2)没有好办法使用某种方式确实存在的时钟但是没有在time.h中定义(虽然这种情况很可能非常罕见)。
另外,你是否认为这只是因为数值1在Linux上用于CLOCK_MONOTONIC
而在Cygwin下用于CLOCK_REALTIME
意味着这些时钟可能在某种程度上相同?可能并非如此。这些数字是任意的,你不应该关心它们;这就是符号常数存在的原因!