timer_create():-1 EAGAIN(资源暂时不可用)
问题描述:
我无法在运行ARM的嵌入式Linux下创建计时器。我正在使用自制的C++库来管理定时器。我自己没有编写代码,尽管我可以访问源代码,但我并不十分了解它的实现......它工作了一段时间,然后我得到了错误“EAGAIN”。timer_create():-1 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)
),请注意,这会分配真实的内核内存 - 这是一个非常有限的资源。
我建议修改您的应用程序以删除或重新使用旧的计时器。
+0
感谢您的聪明回答!我认为我们的应用程序需要一些重构和定时器销毁......正如所说的ereOn,销毁你不再需要的资源总是一个好主意!谢谢你们! – morandg
你不能简单地处理'EAGAIN'错误并重复创建你的计时器吗?或者在每次通话结束一段时间后,EAGAIN错误会消失? – rekire
我真的不太了解您的具体计时器问题,但是当您不再需要它时摧毁某些东西肯定似乎是一个好主意。 – ereOn
它总是使EAGAIN错误... – morandg