select()에서 block될 경우 block을 탈출하는 방법..??
글쓴이: twins99 / 작성시간: 화, 2007/11/27 - 10:52오전
select를 사용한 timeout을 구현하고 있습니다.
간단히 설명하자면,
select();
if(OK)
recv();
이런식입니다.
문제는 LAN Cable을 뽑거나 select에서 timeout 시간이 길게 setting된 경우에 thread를 종료시키기 어렵다는 점입니다.
다시말해 위 '모'thread에서 '자식' thread를 종료 시키기 위한 방법으로 종료 flag setting과 check방법을 사용하는데,
자식 thread가 flag를 check하려면 select()의 block에서 빠져 나와야 합니다.
select()를 빠져나오기 위한 방법으로 socket file descriptor를 close시켜야 한다고 들었습니다.
그런데, FD_CLR()도 call해 주어야 정리가 되는 것인가요? 순차적으로 잘 종료시키기 위한 방법에 대해 문의 드립니다.
Forums:
select탈출 1.
select탈출
1. 타임아웃을 준다.
2. 더미소켓(탈출전용)을 열고, 이에 대해 read이벤트를 대기한다. 질문자가 언급한 플래그를 세팅할때, 이 더미소켓에 단순하게 write()한다. 말그대로 이 더미소켓에서 수신된 데이터는 읽어서, 그냥 버릴뿐, select에서 탈출했으니, 해당처리를 한다.
3. 2와 유사하게 write, exception이벤트에 대해서도 처리할 수 있다.
4. 기본적인 사항으로 "모든 유닉스의 블록킹 모드 시스템호출은 signal을 받으면 무조건 블록모드에서 탈출한다" 라는 것을 이용하여, 사용자정의 시그널 또는 특정 시그널을 주어 select를 탈출 시킬 수 있다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
댓글 달기