除了POSIX定时器之外,Linux中还有哪些其他定时器API?

4
我想在Linux中设计一个定时器,但由于某些系统限制和设计要求,我不能使用POSIX计时器API。请问除了POSIX计时器之外,在Linux中还有哪些其他计时器设计机制可用?(避免使用timer_create、timer_settime等方法)
提前感谢您的帮助。
注:由于我们的代码是专有代码,所以不能使用任何第三方库(如ACE库)。如果您提供了任何机制,请提供一些有用的链接或示例链接。

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

4

请查看我的回答。我发现在Linux系统调用中提供的timerfd_create() API是其中一个有用的计时器。当您的应用程序结构基于事件循环时,它能够很好地融合。


@Manish:谢谢,让我检查一下,很快就会在几分钟内回复您 :) - RajSanpui
@Manish:谢谢,我觉得你让我走上了一条好路。但是,为什么man手册没有显示timerfd_create呢? - RajSanpui
@kingsmasher1:我能够获取它。Ubuntu 10.04 - Manish
@Manish:好的,无论如何,让我从一些例子中尝试一下。谢谢你。让我看看其他人的回复,如果没有,我会接受你的帖子。 - RajSanpui
@Manish timerfd_create是一项相当新的发明,你的Linux可能太旧了。或者你只是没有安装适当的man页面。 - nos

2
如果您正在寻找第三方库,可以免费下载ACE库。该库包含计时器、队列、线程等功能。

没有其他的 POSIX 定时器或任何其他计时器 API 规范吗?希望避免使用第三方库。 - RajSanpui
我不确定...除了timer_create等函数外,我不知道还有哪些其他的POSIX定时器。 - Mayank
@Mayank:你能给我一些使用ACE库设计定时器的相关链接吗? - RajSanpui
我在这里找到了一个例子:http://huihoo.org/ace_tao/ACE-5.2+TAO-1.2/ACE_wrappers/docs/tutorials/Chap_5/ex03.html - Mayank
嗯,我不确定。但在我们的组织中使用它是因为它是平台无关的。它是C的包装器。我们使用ACE_OS::atoi而不是标准API调用atoi。这一切都让我认为它应该可以在任何C++编译器中工作。但是,请你也从你的方面确保一下。我只在英特尔/斯巴克处理器上工作过。 - Mayank
显示剩余2条评论

0

最简单、最便携的方法可能就是使用pthread_createclock_nanosleep实现自己的计时器。对于简单的东西,它不应该需要超过约50行代码,而对于一个完全通用的API(包括溢出计数等),也许需要100-150行代码。


问题在于,对于没有其他线程运行的单体内核来说,这种方法是可行的 :). 但在一个有成千上万个其他线程并行运行的多线程环境中,由于其他高优先级线程的存在,我的“线程定时器”在实时上可能无法到期。而且,如果我提高优先级并使用SCHED_FIFO等(仅仅为了确保)以防止其他线程在我的线程运行时占用CPU,那么与我的工具相关联的其他程序线程在我的计时器到期之前就不能运行自身。所以你提出的方法是不可行的 :( - RajSanpui
除非您已经在硬件上测量了CPU时间并确定计时器处理程序始终有足够的时间,否则您必须准备好超限;只要它们被报告,您就处于相当不错的状态。您可以将其余问题作为API的一部分。每个计时器在创建时都可以具有优先级,该优先级将分配为计时器线程的优先级。 - R.. GitHub STOP HELPING ICE
@R:有一件事很明显,每个计时器都会有一些超时,即使我使用了内置的 POSIX,所以我猜没有计时器能够在真实时间内过期 :( - RajSanpui
如果您的进程具有最大优先级的实时调度,并且计时器运行的线程(或传递到的线程)没有执行可能会阻塞/休眠的操作(如文件系统或网络访问),并且您的CPU足够快以执行您正在执行的任务,则应该可以拥有一个没有超时的计时器。但是,在现代CPU上,仍然需要担心诸如不同电源状态等问题。如果您能找到一种跟踪和处理超时的方法,那么以这种方式进行操作会更加健壮。 - R.. GitHub STOP HELPING ICE
是的,但我们使用的是ARM CPU,我们的用户空间(分发)也是由我们开发的,最后是CE-Linux,它在拥有数千个应用程序的设备上运行,所以尽管我同意您的说法,但这种情况理想上很难实现。 - RajSanpui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接