timer_create (): -1 EAGAIN (ресурс временно недоступен) - PullRequest
3 голосов
/ 18 ноября 2011

У меня проблемы с созданием таймера под моим встроенным Linux под управлением ARM. Я использую самодельную библиотеку C ++ для управления таймером. Я не кодировал его сам, я не очень хорошо знаю реализацию, несмотря на то, что у меня есть доступ к исходному коду ... Это работает некоторое время, а затем я получил ошибку "EAGAIN".

Используя strace, я заметил, что когда он не работает, ID таймера очень высокий!

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

Смотрите довольно низкий идентификатор таймера, когда он работает:

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

Я думал, что количество таймеров не ограничено! Вообще-то нет? Должны ли мы уничтожить таймер, как только мы покончим с этим? Я также использовал утилиту ядра «timer_stats», но это мне мало помогло ... Есть ли другая утилита отладки для таймеров внутри ядра или какой-либо другой инструмент?

Спасибо за вашу помощь!

1 Ответ

6 голосов
/ 18 ноября 2011

Вы правильно догадались, у вас есть максимальное количество таймеров:

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

Страница man 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)), имейте в виду, что это выделяет реальную память ядра - что крайне ограниченный ресурс.

Я предлагаю изменить приложение для удаления или повторного использования старых таймеров.

...