我在运行 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)).
The 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
in bash(1)
),请注意,这会分配真正的内核内存——这是一种极其有限的资源。
我建议修改您的应用程序以删除或重新使用旧计时器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)