如何检查系统是否支持“单调时钟”?

2024-02-22

我需要在代码中处理超时场景并想使用clock_gettime(CLOCK_MONOTONIC)如果系统支持单调时钟。

#ifdef CLOCK_MONOTONIC
    clock_gettime(CLOCK_MONOTONIC, & spec);
#else
    clock_gettime(CLOCK_REALTIME,  & spec);
#endif

我不确定这是否足够。也就是说系统有没有可能定义CLOCK_MONOTONIC它并不真正支持单调时钟?或者检查是否支持单调时钟的可靠方法是什么?


根据 POSIX 的字母,您实际上可能需要运行时测试,即使常量CLOCK_MONOTONIC被定义为。处理这个问题的官方方法是使用_POSIX_MONOTONIC_CLOCK“功能测试宏”,但这些宏的语义非常复杂:引用http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html 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

但是,如果您始终在定义 CLOCK_MONOTONIC 本身时进行运行时测试,则它会更简单且更具可读性:

#ifdef CLOCK_MONOTONIC
    if (clock_gettime(CLOCK_MONOTONIC, &spec))
#endif
        clock_gettime(CLOCK_REALTIME, &spec);

在支持的当前一代操作系统上,这会增加代码的大小一些微不足道的量CLOCK_MONOTONIC,但在我看来,可读性的好处是值得的。

还有一个非常有力的理由支持使用CLOCK_MONOTONIC无条件地;您更有可能找到不支持的操作系统clock_gettime与具有该功能的操作系统相比,根本没有(例如,据我所知,MacOS X 仍然没有它)clock_gettime但不是CLOCK_MONOTONIC.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查系统是否支持“单调时钟”? 的相关文章

  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 使用 C# 和 ASP.NET 在电子邮件附件中发送 SQL 报告

    我正在尝试使用 ASP NET 和 C 从 sql reportserver 2008 作为电子邮件附件发送报告 到目前为止我学会了如何获取 PDF 格式的报告 http weblogs asp net srkirkland archive
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • 条件类型定义

    如果我有一小段这样的代码 template
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • 调用 .ToArray() 时出现 ArgumentException

    我有一个经常被清除的列表 代码完全是这样的 VisitorAgent toPersist List
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • 如何获取带有某个属性注释的所有属性?

    我刚刚从 Roslyn 开始 我想找到所有用属性名称 OneToOne 注释的属性 我启动了 SyntaxVisualizer 并能够获取对该节点的引用 但我想知道是否有更简单的方法来实现此目的 这就是我所拥有的 var prop docu
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 删除除我想要的之外的所有数组元素?

    我有一个控制器 它从 HTML 表单中获取 post 参数 然后将它们发送到模型 该模型将数组插入到 Cassandra 数据库中 它是 SQLInjection 证明 因为它是 NoSQL 但是我担心用户可以模拟 100k post 参数
  • 在 Go 中,如何自动将循环索引强制转换为 uint?

    我有一些功能需要uint作为他们的输入 func foo arg uint func bar arg uint func baz arg uint 我有一个循环 其极限都是常数uint values const Low 10 High 20
  • 将图像存储在plist中

    我们如何将图像存储在 plist 文件中 这个plist文件存储在哪里 谁能给我举个例子吗 答案将不胜感激 The UIImage不直接实现 plist 中存储所需的 NSCoder 协议 但是 添加起来相当容易 如下所示 UIImage
  • 如何为 Ruby 应用程序创建 REST API?

    我想知道如何为 Ruby 应用程序提供 REST API 我可以基于 Ruby 的 TCPServer API 编写一些代码 但这似乎有点低级 您认为这会是一个好的解决方案吗 或者您推荐更好的方法 您可以使用Sinatra http www
  • 如何为 classyCountdown.js 插件设置特定的 GMT 结束时间?

    RE http www class pm files jquery classycountdown http www class pm files jquery classycountdown 这个简单的 jquery 倒计时插件完全按照我
  • Flutter 应用程序:IOS 模拟器未连接到 Android Studio

    在flutter开发中我想将iOS模拟器连接到android studio 当我从 android studio 打开 iOS 模拟器时 它会打开 但应用程序不会运行 它给出诸如 没有连接的设备 之类的错误 项目从 Xcode 运行 但从
  • 有没有办法将变量传递到 Meteor 中的模板中?

    我一直在尝试 Meteor 并遇到了一些我无法弄清楚的事情 为了好玩 我尝试制作一台老虎机 我有以下 HTML div class slot wrapper gt slot gt slot gt slot div
  • 在 Android 中更改 Maps V2 的地图标记的 z 索引(z 顺序)

    我的地图上显示了几个标记 这些标记要么彼此靠近 要么甚至彼此重叠 我需要一个特定的标记始终位于顶部 无论我首先还是最后将标记添加到地图中 它通常最终会被放置在某些标记后面 由于某种神秘的原因 谷歌地图确定了这一点 它需要与 Android
  • 意外的令牌导出

    作为一名新的 Angular 菜鸟 我正在尝试将我之前使用的 Angular 2 0 0 beta17 Web 应用程序升级到 Angular 2 3 0 现在我在加载 启动应用程序时遇到问题 这是我的设置 为了解决问题 我暂时复制了 we
  • 如何修复 java.lang.IllegalStateException:无法清除 JavaAgentClassRegister。 Set 方法尚未被调用。?

    我正在使用 JunitRunner 运行使用 PowerMock 和 Mockito 编写的单元测试 使用的 Spring Boot 版本是
  • 如何将数组分成两个子集并保持数组子值的总和尽可能相等

    我这里真的需要一个算法大师 所以问题是我得到了一个像这样的数组 870 23 970 78 110 50 我想把它分开 这样它看起来像这样 first array 970 78 second array 870 23 110 50 那么现在
  • Android 无效负载类型

    新的更新后 我发现操作栏和 LG 设备中可扩展 格式化字符串的兼容性问题 这是我之前的代码 SpannableString s new SpannableString About s setSpan new TypefaceSpan thi
  • 阻止用户调整 ListView 中的列宽?

    我的 Winform 中有一个 ListView 有 4 列 名称 金钱 ID 和级别 问题是当我运行我的应用程序时 我仍然有能力弄乱列宽 并改变它们 我搜索并发现我应该做这样的事情 private void listView1 Colum
  • MySQL 删除表

    我将使用什么 MySQL 语法来删除与它们具有相似模式的多个表 就像是 DROP TABLES FROM Database1 LIKE SubTable 由于准备好的语句支持 DROP TABLE 因此可以通过以下方式完成 SET tabl
  • Matplotlib 文本不会以 xkcd 字体显示

    当将 xkcd 与 matplotpib 一起使用时 没有任何字体以通常的漫画字体显示 有什么改变或者我做错了什么吗 x df Time y df Adjustment fig plt figure ax fig add subplot 1
  • 随机顺序和分页 Elasticsearch

    In 这个问题 https github com elasticsearch elasticsearch issues 1170 issuecomment 4587811是使用可选种子进行排序的功能请求 允许重新创建随机顺序 我需要能够对随
  • 使用 Javascript 替换文本字符串中的某些阿拉伯语单词[重复]

    这个问题在这里已经有答案了 我有一个阿拉伯语文本字符串 我想将一些单词加粗并在单词前添加图标 我用于英文文本的方法是 var wordsToBold Properties How To Use function makeBold input
  • 设置 urllib2.request() 调用的超时

    我需要设置超时urllib2 request 我不使用urllib2 urlopen 因为我正在使用data的参数request 我该如何设置这个 虽然urlopen确实接受data参数为POST 你可以打电话urlopen on a Re
  • 使用 Snap.svg 循环播放动画

    背景 我使用 Snap svg 渲染一个圆 然后在悬停时为其半径设置动画 我已经用下面的代码处理了该部分 Problem 我试图获得一次循环 脉冲 效果circleRadar悬停在上面 这将涉及在初始r和新的r70 虽然文档提到了 snap
  • 如何检查系统是否支持“单调时钟”?

    我需要在代码中处理超时场景并想使用clock gettime CLOCK MONOTONIC 如果系统支持单调时钟 ifdef CLOCK MONOTONIC clock gettime CLOCK MONOTONIC spec else