【发布时间】:2011-11-18 08:05:42
【问题描述】:
我无法在运行 ARM 的嵌入式 Linux 下创建计时器。我正在使用自制的 C++ 库来管理计时器。我自己没有编写代码,尽管我可以访问源代码,但我并不深入了解实现......它工作了一段时间,然后我收到错误“EAGAIN”。
使用 strace 我注意到,当它不起作用时,计时器 ID 非常高!
timer_create(CLOCK_MONOTONIC, {0, SIGRT_3, SIGEV_SIGNAL, {...}}, 0xbed50af4) = -1 EAGAIN (Resource temporarily unavailable)
在它工作时查看相当低的计时器 ID:
timer_create(CLOCK_MONOTONIC, {0x3, SIGRT_3, SIGEV_SIGNAL, {...}}, {0x3d}) = 0
我以为定时器的数量是无限的!其实并不是?一旦我们完成了计时器,我们应该销毁它吗?我还使用了“timer_stats”内核实用程序,但这对我没有多大帮助......内核内的计时器或任何其他工具是否有其他调试实用程序?
感谢您的帮助!
【问题讨论】:
-
您不能简单地处理
EAGAIN错误并重复创建您的计时器吗?还是每次通话一段时间后都会出现EAGAIN错误? -
我真的不太了解您的具体计时器问题,但是当您不再需要某些东西时销毁它绝对是个好主意。
-
总是出现 EAGAIN 错误 ...
-
“我们是否应该在完成计时器后销毁它” - 呃?
-
为了释放资源并且不碰到最大创建的计时器数量,我们当然会这样做。这不仅对计时器有效,而且对分配的任何类型的资源(文件描述符、互斥体、线程……)都有效。但是,这也取决于您的设计和上下文,如果您打算重用计时器,在下次使用时保留资源可能会稍微快一些。请参阅 sarnold 接受的答案“我建议修改您的应用程序以删除或重新使用旧计时器。” ...