2011-11-18 3 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"커널 유틸리티를 사용했는데 이것은별로 도움이되지 않았다 ... 커널이나 다른 도구 안에 타이머를위한 다른 디버그 유틸리티가 있습니까?

도움 주셔서 감사합니다. 당신이 setrlimit(2)을 올릴 수 있지만

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. 

:

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) 맨 그것에 대해 좀 더 무딘 :

+0

'EAGAIN' 오류를 간단하게 처리하고 반복하여 타이머를 만들 수 없습니까? 아니면 모든 호출마다 'EAGAIN' 오류가 발생합니까? – rekire

+1

나는 정말로 당신의 특정 타이머 문제에 관해 많이 알지 못한다.하지만 더 이상 필요하지 않을 때 무언가를 파괴하는 것은 좋은 생각 인 것 같다. – ereOn

+0

항상 EAGAIN 오류가 발생합니다 ... – morandg

답변

4

당신은 당신이 타이머의 최대 개수를 수행 정확하게 짐작 (ulimit -i in bash(1)) 보류중인 신호에 제한을두면이 제한된 리소스 인 실제 커널 메모리가 할당된다는 점에 유의하십시오.

이전 타이머를 삭제하거나 다시 사용하도록 애플리케이션을 수정하는 것이 좋습니다.

+0

영리한 답변 주셔서 감사합니다! 우리 애플리케이션에는 리팩터링과 타이머가 필요하다고 생각합니다 ... 말한대로, 더 이상 필요하지 않은 자원을 파괴하는 것은 항상 좋은 생각입니다! 다들 감사 해요! – morandg

관련 문제