- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
大多数 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
或其他系统中的任何内容?
最佳答案
如果我试图编写一个最大程度可移植的程序,我会限制自己使用相关标准中定义的符号值。 (根据您的说法,这听起来像 CLOCK_REALTIME
—— 也许只有那个值 —— 是标准的。)
如果某些系统实现了我想使用的有用扩展,我会通过说来测试它们
#ifdef CLOCK_MONOTONIC_COARSE
... my code calling clock_gettime(CLOCK_MONOTONIC_COARSE, &ts) ...
#endif
如果真的存在相同的符号值最终意味着截然不同的东西的系统,我会举手宣布这是一个可移植性噩梦,至少我尝试过的那种远离。
在回答您的其他问题时,(1) 不,对符号值做出假设是不明智的,并且 (2) 没有好的方法来使用以某种方式确实存在但未按时间定义的时钟。h (尽管希望这种情况很少见)。
此外,您是否假设仅仅因为数值 1 用于 Linux 上的 CLOCK_MONOTONIC
而用于 Cygwin 下的 CLOCK_REALTIME
就意味着这些时钟可能以某种方式相同?情况可能并非如此。这些数字是任意的,你不应该关心它们;这就是符号常量存在的原因!
关于clockid_t(clock_gettime 第一个参数)可移植性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31073923/
我正在尝试在 Mac OS X 上使用在 Linux 平台上编写的 C 代码。我遇到了与计时器相关的错误: ../src/stinger/timer.c:61:1: error: unknown ty
大多数 POSIX 兼容系统都提供了获取或设置高分辨率计时器之一的功能: int clock_gettime(clockid_t clock_id, struct timespec *tp); 每个系
我正在开发一个新的 Linux 调度程序,我需要 hrtimers。我阅读了如何实现它们,在: http://lwn.net/Articles/167897/ 我做了一个小程序,在使用之前测试这些定时
我写了一个简单的timer函数,用g++编译,奇怪的是问timer_create的原型(prototype)是:int timer_create(clockid_t, sigevent*, void*
将 React Native 从 0.61.5 升级到 0.63.2 后,Flipper在 IOS 上导致错误为 typedef redefinition with different types (
我正在查看 react native 项目的源代码,但在构建它时遇到了问题。 运行以下命令后 npm install在项目的根目录 pod install在ios文件夹 我在终端收到以下消息: sh:
我的目标是运行一个 React Native 构建(iOS 版本)。 情况一 行动:启动地铁(确定) 构建 ios。问题:构建失败,退出代码为 1。 (CompileC /Users/macbook/
我是一名优秀的程序员,十分优秀!