簡體   English   中英

timer_create(): - 1 EAGAIN(資源暫時不可用)

[英]timer_create() : -1 EAGAIN (Resource temporarily unavailable)

我在運行ARM的嵌入式Linux下創建計時器時遇到了麻煩。 我正在使用自制的C ++庫來管理計時器。 我自己沒有編寫代碼,盡管我已經訪問了源代碼,但我並不深入了解實現...它工作了一段時間然后我得到了錯誤“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”內核實用程序,但這對我沒有多大幫助......內核中的定時器還是其他任何工具都有其他調試工具嗎?

謝謝你的幫助!

你猜錯了,你確實有最多的計時器:

   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)限制( bash(1) ulimit -i ),但要注意這會分配真正的內核內存 - 這是一個非常有限的資源。

我建議修改您的應用程序以刪除或重新使用舊計時器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM