mor*_*ndg 3 c c++ linux arm timer
我在运行ARM的嵌入式Linux下无法创建计时器。我正在使用自制的C ++库来管理计时器。我自己没有编写代码,尽管可以访问源代码,但我对实现并不十分了解。它工作了一段时间,然后出现错误“ EAGAIN”。
我使用strace注意到,当它不起作用时,计时器ID会偏高!
timer_create(CLOCK_MONOTONIC, {0, SIGRT_3, SIGEV_SIGNAL, {...}}, 0xbed50af4) = -1 EAGAIN (Resource temporarily unavailable)
Run Code Online (Sandbox Code Playgroud)
工作时,请查看计时器ID较低:
timer_create(CLOCK_MONOTONIC, {0x3, SIGRT_3, SIGEV_SIGNAL, {...}}, {0x3d}) = 0
Run Code Online (Sandbox Code Playgroud)
我以为计时器的数量是无限的!其实并不是?一旦完成,是否应该销毁计时器?我还使用了“ 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)).
Run Code Online (Sandbox Code Playgroud)
手册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.
Run Code Online (Sandbox Code Playgroud)
虽然您可以提高setrlimit(2)待处理信号的限制(ulimit -i中的bash(1)),但是请注意,这会分配实际的内核内存-这是一种极为有限的资源。
我建议修改您的应用程序以删除或重复使用旧计时器。
| 归档时间: |
|
| 查看次数: |
2344 次 |
| 最近记录: |