【问题标题】:timer_create() : -1 EAGAIN (Resource temporarily unavailable)timer_create() : -1 EAGAIN (资源暂时不可用)
【发布时间】: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 接受的答案“我建议修改您的应用程序以删除或重新使用旧计时器。” ...

标签: c++ c linux timer arm


【解决方案1】:

您猜对了,您确实有最大数量的计时器:

   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 所说,销毁您不再需要的资源总是一个好主意!谢谢大家!
猜你喜欢
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 2021-02-21
  • 2018-08-04
  • 2021-05-07
  • 2018-02-24
相关资源
最近更新 更多