【问题标题】:What are the other timer APIs in Linux apart from POSIX timers?除了 POSIX 计时器,Linux 中还有哪些其他计时器 API?
【发布时间】:2011-05-05 05:25:59
【问题描述】:

我想在 Linux 中设计一个计时器,但由于一些系统限制和设计要求,我无法使用 POSIX 计时器 API。

有人可以告诉我,除了 POSIX 计时器之外,Linux 中还有哪些其他可用的计时器设计机制? (避免使用 timer_create、timer_settime 等)

提前致谢。

编辑:P.S:您提供的任何机制,请您给我一些有用的链接或示例链接

注意:我们不能使用任何第三方库(如 ACE 库),因为我们的代码是专有代码。

【问题讨论】:

  • 可以在专有软件中使用第三方库,只要他们的许可允许。例如,对于许多许可( GPL)开源许可证,允许将其嵌入到纯二进制商业软件中。
  • @ThiefMaster:我们的老板很怀疑 :),如果明天许可证更改,那么谁来更改所有这些代码?
  • 然后你可以继续使用你拥有的代码。许可证不能追溯更改 - 它只会影响未来的版本。除此之外,在这种情况下,很可能有人创建了一个保持开源的分支。

标签: c linux timer


【解决方案1】:

查看我的answer。我发现有用的计时器之一是 Linux 系统调用中提供的timerfd_create() API。当您的应用程序基于事件循环构建时,这很好地融合了。

【讨论】:

  • @Manish:谢谢,让我检查一下,几分钟后尽快回复您 :)
  • @Manish:谢谢,我认为你让我走上了一条好路。但是为什么,手册页没有显示 timerfd_create?
  • @kingsmasher1:我能得到它。 Ubuntu 10.04
  • @Manish:好的,无论如何让我从一些例子中尝试一下。谢谢你。让我看看其他人的回复,如果没有会接受你的帖子。
  • @Manish timerfd_create 是一项相当新的发明,您的 Linux 可能太旧了。或者您只是没有安装正确的手册页。
【解决方案2】:

如果您正在寻找第 3 方,可以免费下载 ACE 库。他们有计时器、队列、线程等

【讨论】:

  • 是否没有其他 POSIX 计时器或任何其他计时器 API 规范?想要避免使用 3rd 方库。
  • 我不确定...除了 timer_create 等我不知道任何其他 POSIX 计时器。
  • @Mayank:你能给我任何使用ACE库设计定时器的相关链接吗?
  • 签出this
  • 我找到了一个例子here
【解决方案3】:

最简单和最便携的方法可能就是使用pthread_createclock_nanosleep 来实现自己的计时器。简单的事情不应该超过 50 行代码,而对于具有溢出计数等的完全通用的 API 可能需要 100-150 行代码。

【讨论】:

  • 问题是,对于没有其他线程运行的单片内核来说,它会做得很好:)。但是在有数千个其他线程并行运行的多线程环境中,由于其他一些高优先级线程,我的threaded timer 总是有可能不会实时过期。此外,如果我增加优先级并使用 SCHED_FIFO 等(只是为了确保)在我的线程运行时没有其他线程可以占用 CPU,那么链接到我的工具的其他程序的线程在我的计时器之前没有机会自行运行expires.So这不是你建议的可行方式:(
  • 除非您已经测量了硬件上的 cpu 时间并确定计时器处理程序将始终有足够的时间,否则您必须为超限做好准备;只要他们被报告,你的状态就很好。您可以将其余问题作为 API 的一部分。每个计时器在创建时都可以有一个优先级,该优先级被分配为计时器线程的优先级。
  • @R: 有一点很明显,即使我使用内置的 POSIX,每个计时器都有一些溢出,所以我猜没有计时器会实时过期:(
  • 如果您的进程具有最大优先级的实时调度,并且计时器运行(或交付给)的线程没有执行任何可能阻塞/休眠的操作(如文件系统或网络访问),并且您的cpu 对于您正在执行的任务来说足够快,那么应该可以有一个没有溢出的计时器。但是在现代 cpu 上,您仍然需要担心不同的电源状态等问题。如果您能找到一种方法来跟踪和处理溢出,那么这样做会更加健壮。
  • 是的,但是我们的是ARM CPU,我们的用户区(发行版)也是我们开发的,最后是CE-Linux,它运行在有数千个应用程序的设备上,所以虽然我同意您的陈述,但理想情况下这种条件很难实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 2011-05-12
  • 2012-02-18
  • 1970-01-01
  • 2012-09-08
相关资源
最近更新 更多