pyn*_*exj 4 c unix linux posix
我需要在代码中处理超时场景,并且clock_gettime(CLOCK_MONOTONIC)如果系统支持Monotonic Clock ,则需要使用.
#ifdef CLOCK_MONOTONIC
clock_gettime(CLOCK_MONOTONIC, & spec);
#else
clock_gettime(CLOCK_REALTIME, & spec);
#endif
Run Code Online (Sandbox Code Playgroud)
我不确定这是否足够.也就是说,系统是否可能CLOCK_MONOTONIC通过它定义并不真正支持单调时钟?或者检查是否支持单调时钟的可靠方法是什么?
根据POSIX的字母,即使CLOCK_MONOTONIC定义了常量,您实际上也可能需要运行时测试.处理此问题的官方方法是使用_POSIX_MONOTONIC_CLOCK"功能测试宏",但这些宏的语义非常复杂:引用http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html,
如果未定义符号常量或使用值-1定义符号常量,则编译不支持该选项.如果定义的值大于零,则在执行应用程序时应始终支持该选项.如果使用零值定义,则应支持该选项进行编译,并且可能在运行时支持或不支持该选项.
将这种三向区分转换为代码会给你这样的东西:
#if !defined _POSIX_MONOTONIC_CLOCK || _POSIX_MONOTONIC_CLOCK < 0
clock_gettime(CLOCK_REALTIME, &spec);
#elif _POSIX_MONOTONIC_CLOCK > 0
clock_gettime(CLOCK_MONOTONIC, &spec);
#else
if (clock_gettime(CLOCK_MONOTONIC, &spec))
clock_gettime(CLOCK_REALTIME, &spec));
#endif
Run Code Online (Sandbox Code Playgroud)
但是如果你在定义CLOCK_MONOTONIC本身时总是进行运行时测试,它会更简单,更易读:
#ifdef CLOCK_MONOTONIC
if (clock_gettime(CLOCK_MONOTONIC, &spec))
#endif
clock_gettime(CLOCK_REALTIME, &spec);
Run Code Online (Sandbox Code Playgroud)
这会使代码的大小增加一些微不足道的数量,对于支持的当前操作系统CLOCK_MONOTONIC,但在我看来,可读性的好处是值得的.
CLOCK_MONOTONIC无条件使用也有很强的理由; 你更有可能找到一个根本不支持的操作系统clock_gettime(例如MacOS X仍然没有它支持),而不是一个有clock_gettime但没有的操作系统CLOCK_MONOTONIC.
| 归档时间: |
|
| 查看次数: |
630 次 |
| 最近记录: |