2011-11-18 55 views
2

我无法在运行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”内核实用程序,但是这对我没有多大帮助......是否有内核或任何其他工具中定时器的其他调试实用程序?

感谢您的帮助!

+0

你不能简单地处理'EAGAIN'错误并重复创建你的计时器吗?或者在每次通话结束一段时间后,EAGAIN错误会消失? – rekire

+1

我真的不太了解您的具体计时器问题,但是当您不再需要它时摧毁某些东西肯定似乎是一个好主意。 – ereOn

+0

它总是使EAGAIN错误... – morandg

回答

4

你猜对了,你有计时器的最大数量:

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

相关问题