我在运行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”内核实用程序,但这对我没有多大帮助......内核中的定时器还是其他任何工具都有其他调试工具吗?
感谢您的帮助!
答案 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)
限制,但要注意这会分配真正的内核内存 - 这是一种非常有限的资源。
我建议修改您的应用程序以删除或重复使用旧计时器。