我在运行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”内核实用程序,但这对我没有多大帮助。是否在内核或其他任何工具中为计时器提供了其他调试实用程序?

谢谢你的帮助!

最佳答案

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

   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)),但是请注意,这会分配实际的内核内存,这是一种极为有限的资源。

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

关于c++ - timer_create(): -1 EAGAIN (Resource temporarily unavailable),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8179427/

10-08 22:44