2013-08-07 1 views
2

epoll_wait()가 등록 된 소켓 (epoll_ctl())이 읽기/쓰기가 가능한 이벤트를 수신하는 방법이 궁금합니다.어떻게 소켓 이벤트가 epoll로 전파/변환 되나요?

나는 glibc가 마술처럼 그것을 처리한다고 믿는다.

그런 다음 소켓에 대해 다음 이벤트를 트리거하는 방법을 설명하는 문서가 있습니까?

  1. EPOLLPRI
  2. EPOLLRDNORM
  3. EPOLLRDBAND
  4. EPOLLWRNORM
  5. EPOLLWRBAND
  6. EPOLLMSG
  7. EPOLLERR
  8. EPOLLHUP
  9. EPOLLRDHUP
  10. ,

P. 원래 나는 내 상자에 sys/epoll.h에 enum EPOLL_EVENTS를 붙여 넣으려고했다. stackoverflow 나는 코드 블록을 올바르게 포맷하지 않는다고 생각하지만 사전 및 코드 태그, 어떤 생각으로 포장 했는가?

+1

는 epoll에가하는이 게시물과 커널의 모든 중요한 일을 잘 설명 : http://stackoverflow.com/questions/5383959/why-exactly-does-epoll-scale-better-than-poll .. 당신이 해결하려고하는 문제가 정확히 무엇입니까? –

+0

@ShafikYaghmour 귀하의 코멘트를 대답으로 옮겨야합니다. –

답변

1

epoll의 모든 중요한 작업은 커널에서 수행되며, 사용자 공간 API는 단지 인터페이스 일뿐입니다. Why exactly does ePoll scale better than Poll?의 이전 스레드는 커널이 epoll을 구현하는 방법에 대한 세부 사항을 다루고 있습니다. 그들은 epoll_ctl(2) man page 트리거되는 이벤트를 설명하는 문서의 방법으로

예를 들어, 각 이벤트를 다루고 다음 epoll(7) man page을 읽는 당신이 필요로하는 EPOLLET의 더 나은 설명은

EPOLLIN 
      The associated file is available for read(2) operations. 

EPOLLOUT 
      The associated file is available for write(2) operations. 

.

이것은 complete example of how to use epoll입니다.

event.events = EPOLLIN | EPOLLET; 
s = epoll_ctl (efd, EPOLL_CTL_ADD, infd, &event); 
+0

제 궁금한 점은 다른 많은 가능한 사건들이 있다는 것입니다. 그러나 소켓의 각 이벤트 유형이 epoll_wait()로 전파되는 상황을 언급하는 문서는 없습니다. 예를 들어, epoll_wait()가 EPOLLRDNORM을 수신 할 소켓은 어떻게 될까요? – Hei

+0

그건 그렇고, 귀하의 링크가 내 질문에 대답하지 않지만, 좋은 정보가 많이 있습니다. Shafik 공유에 감사드립니다! – Hei

+0

@Hei 내가 알기를, 당신이 받기를 원하는 이벤트를 요청하기 위해'epoll_ctl'을 사용하면 예제 코드에 대한 링크를 추가 할 것입니다. –

4

epoll 문서와 가장 두드러진 문제는 "굵은 대문자"의 상태로의 실패 : 당신은 당신이 이벤트 EPOLLINEPOLLET을 받고자하는 이벤트를 요청할 수 epoll_ctl를 사용

는 위의 코드는이 수행 그 epoll 이벤트는 사실 poll (2) 이벤트와 완전히 동일합니다. 사실, 커널 측에 epoll 오래된 poll 이벤트 이름의 관점에서 해당 이벤트를 처리합니다 다음

#define POLLIN  0x0001 // EPOLLIN 
#define POLLPRI 0x0002 // EPOLLPRI 
#define POLLOUT 0x0004 // EPOLLOUT 
#define POLLERR 0x0008 // EPOLLERR 
#define POLLHUP 0x0010 // EPOLLHUP 
#define POLLNVAL 0x0020 // unused in epoll 
#define POLLRDNORM 0x0040 // EPOLLRDNORM 
#define POLLRDBAND 0x0080 // EPOLLRDBAND 
#define POLLWRNORM 0x0100 // EPOLLWRNORM 
#define POLLWRBAND 0x0200 // EPOLLWRBAND 
#define POLLMSG 0x0400 // EPOLLMSG 
#define POLLREMOVE 0x1000 // unused in epoll 
#define POLLRDHUP 0x2000 // EPOLLRDHUP 

, 커널 소스의 간단한 검사는 것을 알 수 :

  • EPOLLINEPOLLRDNORM이 동일 (는 epoll 파일 설명자에서 데이터를 읽을 수있는 경우 EPOLLIN | EPOLLRDNORM을 반환합니다.

  • EPOLLOUTEPOLLWRNORM은 동일합니다 (버퍼 공간을 쓸 수있는 경우 epoll은 EPOLLOUT | EPOLLWRNORM을 반환 함).

  • EPOLLRDBAND 및 기술자 대역에 데이터 아웃 신호의 EPOLLWRBAND 가용성 (일부 소켓에 데이터가 소켓에 전달 MSG_OOB 플래그를 전송할 것이다).

  • EPOLLPRI은 수정 기호이며 항상 다른 이벤트 (예 : EPOLLERR)를 추가합니다. 연관된 디스크립터가 어떤 목적으로 사용되는지에 따라 다소 다른 것들을 의미하기 때문에 서브 시스템에 의존적이다.

  • EPOLLMSG은 커널에서 사용되지 않는 것처럼 보이며 용도가없는 것으로 보입니다.

  • EPOLLRDHUP은 피어가 채널 읽기를 위해 채널을 닫았지만 여전히 데이터를 수신 할 수 있음을 알립니다 (요청 데이터가 더 이상 들어오지 않음을 확인하는 데 편리함).

  • EPOLLHUP은 채널의 측면을 폐쇄했다는 신호입니다.