다양한 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)
'EINTR'은 일반적으로 신호가 epoll 시스템 호출을 인터럽트했음을 의미합니다. 어떤 신호가 전송되는지 파악한 다음, 문제를 해결할 이유와 방법을 파악할 수 있습니다. – bnaecker
이 동작을 볼 수있는 곳에 strace의 출력을 게시 할 수 있습니까? – nos