안녕하세요. 맨날 눈팅만 하다가 사냥터만 생기면 야금야금 경험치 챙기는 crazybird입니당~
다름이 아니라 CENTOS5.5 / Linux 2.6.18 / GCC4.4.6 / c++0x / 위에서 구동되는 녀석을 하나 뚝딱뚝딱 중입니당~
거기에 epoll로 통신하고 epoll_wait timeout을 -1(∞)로 두었는데용(참고로 ET)~
네트워크 단절 | 사용자의 종료로 인해 리소스를 정리할 때에 저 epoll_wait에서 얼음땡이 되어버리네용 ㅠㅠ
궁여지책으로 timeout을 0이나 1 < timeout으로 하려다가 이러면 너무 많은 뺑뺑이를 돌 것 같아 성능이 나오지 않을 것 같고,
signal을 날리자니 signal 특성상 조금 찝찝하고.. 리눅스에서 기본으로 제공해준다던 eventfd는 Linux 2.6.22부터 지원을 한다고 하니 이것 참 ㅠㅠ
어떻게 한는게 좋을까용? 어떻게 하면 우아하게 샤랄라~하면서 리소스들을 정리할 수 있을까요? 레임의 고수분들 도와주세요~
뭐 저는 epoll 이 뭔지도 모르지만 API차원에서 탑다운 방식으로 접근하지 말고 역으로 H/W의 인터럽트 시스템을 OS에서 어떻게 랩핑하고 있는 지 자료를 찾아보는 게
프로그래밍에 도움이 될 거라고 생각합니다. 저는 이 방법이 통하더군요.
@게임초보 답변 주셔서 감사합니다^^ 말씀하신대로 epoll edge trigger 인터럽트 시그널 방식 까보고 결국 해결하긴 했습니다.(더이상 상태변화가 일어나지 않는 fd에 fake event를 가해서 강제적으로 종료루틴을 타게 만들었습니다.) 좀 찝찝하긴 합니다만 현재 상황에서는 이게 최선인 듯 싶습니다. 뭐 최고의 방법은 서버의 커널 버전을 업하면 되지만 그렇게 되면 저희 팀 말고도 다른 어마어마한 규모의 팀이 영향을 받는지라 ㅠㅠ 나중에 좀더 우아한 방법이 없는지 더 찾아봐야겠습니다.
어디에가서도 답을 듣기 어려울 질문일것 같군요.
kldp.org에 가서 검색해 보면 어떨까요?^^;