timer_create() : -1 EAGAIN (Resource temporarily unavailable)

那年仲夏 提交于 2020-01-04 02:38:37

问题


I'm having trouble to create timer under my embedded Linux running ARM. I'm using a home made C++ library to manage timer. I didn't code it myself, I don't know deeply the implementation despite I have access to the source code... It works for a while and then I got the error "EAGAIN".

Using strace I noticed that when it doesn't work the timer ID is quiet high!

timer_create(CLOCK_MONOTONIC, {0, SIGRT_3, SIGEV_SIGNAL, {...}}, 0xbed50af4) = -1 EAGAIN (Resource temporarily unavailable)

See the pretty low timer ID when it's working:

timer_create(CLOCK_MONOTONIC, {0x3, SIGRT_3, SIGEV_SIGNAL, {...}}, {0x3d}) = 0

I thought that the number of timers was unlimited! Actually not? Should we destroy the timer once we are done with it? I also used the "timer_stats" kernel utility but this didn't help me much ... Are there other debug utility for the timers inside the kernel or any other tool?

Thanks for your help!


回答1:


You've guessed correctly, you do have a maximum number of timers:

   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) manpage is a bit more blunt about it:

   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.

While you could raise the setrlimit(2) limit on pending signals (ulimit -i in bash(1)), be aware that this allocates real kernel memory -- which is an extremely limited resource.

I suggest modifying your application to delete or re-use old timers.



来源:https://stackoverflow.com/questions/8179427/timer-create-1-eagain-resource-temporarily-unavailable

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!