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

时间:2011-11-18 08:05:43

标签: c++ c linux timer arm

我在运行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”内核实用程序,但这对我没有多大帮助......内核中的定时器还是其他任何工具都有其他调试工具吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分: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)中的待处理信号ulimit -i提出bash(1)限制,但要注意这会分配真正的内核内存 - 这是一种非常有限的资源。

我建议修改您的应用程序以删除或重复使用旧计时器。