timer_create() : -1 EAGAIN(资源暂时不可用) [英] timer_create() : -1 EAGAIN (Resource temporarily unavailable)

查看:40
本文介绍了timer_create() : -1 EAGAIN(资源暂时不可用)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在运行 ARM 的嵌入式 Linux 下无法创建计时器.我正在使用自制的 C++ 库来管理计时器.我没有自己编写代码,尽管我可以访问源代码,但我对实现并不深入......它工作了一段时间,然后我收到了错误EAGAIN".

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".

使用 strace 我注意到,当它不起作用时,计时器 ID 非常高!

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)

在工作时看到相当低的计时器 ID:

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

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

我以为计时器的数量是无限的!其实并不是?一旦我们完成了计时器,我们应该销毁它吗?我还使用了timer_stats"内核实用程序,但这对我没有多大帮助......内核中是否有其他用于计时器的调试实用程序或任何其他工具?

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?

感谢您的帮助!

推荐答案

您猜对了,您确实有最大计时器数:

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)).

timer_create(3posix) 联机帮助页对此更为直率:

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.

虽然您可以提高对未决信号的 setrlimit(2) 限制(bash(1) 中的 ulimit -i),但请注意这会分配真正的内核内存——这是一种极其有限的资源.

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.

这篇关于timer_create() : -1 EAGAIN(资源暂时不可用)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆