2017-09-30 30 views
1

다양한 fds를 폴링하는 스레드가 있습니다. 시간 제한 설정과 함께 epoll_wait를 사용하고 있습니다.epoll_wait()는 EINTR을 무한대로 반환합니다.

do { 
    n = epoll_wait(epollFd, eventsList, eventsTotal, timeoutMS); 
} 
while ((n<0) && (errno == EINTR)); 

이벤트리스트 메모리 timerfd, signalfd 및 소켓 FD가 포함되어 다음 는 코드입니다.

이 스레드는 타이머 이벤트, 소켓 열기/읽기/쓰기/닫기 이벤트 & 사용자 정의 신호 이벤트를 잘 처리합니다.

그러나 스레드가 무한 do-while 루프에 들어갈 때가 있습니다. errno는 항상 EINTR을 반환합니다.
위로 스레드의 -H은 수면 상태를 표시합니다. strace은 루프에서 epoll_wait()을 호출하고 있음을 나타냅니다.

그럼 잘 받아 들일 수있는 방법을 사용하면서 잘못 될 수 있습니다. epoll_wait & EINTR? 위의 문제를 일으킬 수있는 소켓 읽기/쓰기/닫기에 문제가있을 수 있습니까? 아니면 timerfd로?

업데이트 : 의 strace -p 출력 :

epoll_wait(8, {}, 8192, 10)    = 0 
epoll_wait(8, {}, 8192, 10)    = 0 
epoll_wait(8, {}, 8192, 10)    = 0 
epoll_wait(8, {}, 8192, 10)    = 0 

은 그 때 나는 gcore 명령을했다 및에 epoll_wait에 의해 반환 된 errno는()를 얻기 위해 노력했다. 4 (EINTR)

+0

'EINTR'은 일반적으로 신호가 epoll 시스템 호출을 인터럽트했음을 의미합니다. 어떤 신호가 전송되는지 파악한 다음, 문제를 해결할 이유와 방법을 파악할 수 있습니다. – bnaecker

+0

이 동작을 볼 수있는 곳에 strace의 출력을 게시 할 수 있습니까? – nos

답변

0

최소한 strace 출력의 스 니펫을 보여 주면 도움이 될 것입니다. 최소한 인터럽트가 수신되고 있음을 알려줍니다.

이 정보가 없으면 프로그램에 어떤 문제가 있는지 말할 수 없습니다. 그러나 나는 찾아내는 방법을 알려줄 수 있습니다.

먼저 strace 출력을 살펴보십시오. 프로세스가받는 신호가 무엇인지 알려줍니다.

그런 다음 해당 신호의 신호 처리기를 살펴보십시오. 가지고 있지 않으면 등록하십시오. 그렇게하려면 sigaction을 사용하고 signal이 아닌지 확인하십시오. 또한 최신 sa_sigaction 함수 형식을 사용하고 있는지 확인하십시오.

이 형식으로 신호 처리기는 해당 신호를 보낸 사람에 대한 정보를받습니다. 송신자의 PID, 타이머 인 경우, 타이머 ID 등이 포함됩니다.이 정보를 사용하여 신호가 어디에서오고 있는지 판단하십시오.