2011-11-18 83 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

相關問題