epoll 에서 이벤트 종류 알아내는 방법이...
글쓴이: sjang / 작성시간: 화, 2005/02/15 - 5:03오후
리눅스 커널 2.6에서 epoll를 사용하고 있습니다.
아래 함수
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
를 이용하여 이벤트 발생을 감지할 때, 이벤트가 발생한
소켓 FD에서 이벤트의 종류가 READ 또는 WRITE 이벤트인지
어떻게 구분하나요? 아래는 이것을 위한 코드인데요.
해당 FD에서 epool.h에 정의된 events의 값으로부터
'&' 연산을 이용하여 구하고 있습니다.
이렇게 하는 것이 맞습니까?
typedef struct epoll_event_data { struct epoll_event *events; int nMaxFD; int epoll_fd; } epoll_event_data_t; int get_event_type(epoll_event_data_t *ed, int nEventFD) { __uint32_t events; events = ed->events[nEventFD].events; if (events & EPOLLHUP) return EVENT_HANGUP; else if (events & EPOLLIN) return EVENT_READ; else if (events & EPOLLERR) return EVENT_ERROR; else if (events & EPOLLOUT) return EVENT_WRITE; return -1; }
음....
events = ed->events[nEventFD].events;
위 변수에 저장되는 것이 해당FD에서 발생한 이벤트가 저장되는 것이 아니라, epoll_ctl()를 통해서 FD를 등록할 때 감시할 이벤트의 종류를 지정하기 위한 변수 아닌가요?
추가 질문으로...
epoll_wait()의 두번째 인자 events는, 내부적으로 루프를 돌면서 초기화 과정에서 등록한 FD에서 감시할 이벤트의 종류에 따라서 리턴값이 달라지지 않나요?
select()와 비교하자면 select()가 리턴된 후에는 readfd가 set 인지 writefd가 set 인지 검사하는 FD_ISSET() 함수가 있어서 어떤 이벤트인지 알수 있게 되는데, epoll은 그런것이 없는 듯 하여 말이죠.
질문이 장황하군요.
Forums:
맞습니다.
&연산해서 사용하시면 됩니다.
처음에 epoll_ctl Add에서 주는것과 epoll_wait에서 받아 오는 것은 서로 다른 것입니다.
Add에서 주는 event는 내가 체크할것 OUT,IN등을 나타내는것이고 event를 주면 그것은 epoll 내부적으로 저장되어 가지고 있습니다.
wait에서 받은 event는 현재 읽어야하는지 써야하는지를 알려주는 select에서의 FD와 같은 event입니다.
또한,
epoll_wait(..,event,epoll_size,..) 있을때
epoll_size라는것은 한번에 건져 올려 체크할 event 갯수입니다.
event_size 에 10개를 한번에 건져 올리겠다구 한다면 event 구조체는 10개만 정의해서 사용하시면 됩니다.
저도 epoll을 이용해서 지금 프로젝트 진행중입니다.
아주 좋은 넘입니다.(아직서비스단계는 아니지만 ^^)
댓글 달기