timer_create():-1 EAGAIN(资源暂时不可用)

3
我在运行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 错误? - rekire
1
我对于你的具体计时器问题并不是很了解,但当你不再需要某个东西时将其销毁似乎是一个不错的主意。 - ereOn
它总是会产生EAGAIN错误... - morandg
我们完成计时器后应该销毁它吗?当然要啊。 - user253751
为了释放资源并避免超过最大计时器数量,当然我们应该这样做。这不仅适用于计时器,还适用于任何类型的分配资源(文件描述符、互斥量、线程等)。但是,这也取决于你的设计和上下文,如果你打算重用计时器,保留资源可能会在下次使用时略微更快。请参见sarnold所接受的答案"我建议修改您的应用程序以删除或重新使用旧的计时器。" - morandg
1个回答

6

你猜得对,你确实有最大计时器数量限制:

   The kernel preallocates a "queued real-time signal" for each
   timer created using timer_create().  Consequently, the number
   of timers is limited by the RLIMIT_SIGPENDING resource limit
   (see setrlimit(2)).

timer_create(3posix) 手册对此更加直白:

   The timer_create() function shall fail if:

   EAGAIN The system lacks sufficient signal queuing resources
          to honor the request.

   EAGAIN The calling process has already created all of the
          timers it is allowed by this implementation.

虽然你可以通过提高待处理信号的 setrlimit(2) 限制(在 bash(1) 中使用 ulimit -i)来解决问题,但请注意这会分配真实的内核内存——这是一种非常有限的资源。

我建议修改你的应用程序以删除或重新使用旧的定时器。


感谢您聪明的回答!我认为我们的应用程序需要一些重构和计时器销毁...正如ereOn所说,销毁不再需要的资源总是一个好主意!谢谢大家! - morandg

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