프로그래머 입장에서는 단지 3개정도의 관련 함수만 알면 어렵지 않게 epoll응용 어플의 제작이 가능하다.
4.3.1 epoll_create(2)
epoll_create(int size);
epoll_create()는 이벤트를 저장하기 위한 size만큼의 공간을 커널에 요청한다. 커널에 요청한다고 해서 반드시 size만큼의 공간이 확보되는 건 아니지만 커널이 대략 어느 정도의 공간을 만들어야 할지는 정해줄 수 있다. 수행된 후 파일 지정자를 되돌려 주는데, 이 후 모든 관련작업은 리턴된 파일 지정자를 통해서 이루어지게 된다. 모든 작업이 끝났다면 close()를 호출해서 닫아주어야 한다.
4.3.2 epoll_wait(2)
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); 실제 이벤트가 발생하는걸 기다리고 있다가, 이벤트가 발생하면 이벤트 관련 정보를 넘겨주는 일을 한다.
리턴된 이벤트에 관한 정보는 events에 저장된다. maxevents는 epoll이벤트 풀의 크기다.
timeout는 기다리는 시간이다. 0보다 작다면 이벤트가 발생할 때까지 기다리고, 0이면 바로 리턴,
0보다 크면 timeout 밀리세컨드 만큼 기다린다. 만약 timeout시간에 이벤트가 발생하지 않는다면
0을 리턴한다. 이벤트가 발생했다면 발생한 이벤트의 갯수를 리턴한다.
4.3.3 epoll_ctl(2)
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
op는 fd에 대해서 어떤 작업을 할것인지를 정의하기 위해서 사용된다.
op가 실행된 결과는 event구조체에 적용된다.
다음은 epoll_event구조체의 모습이다.
typedef union epoll_data {
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;
struct epoll_event {
__uint32_t events; /* 발생된 이벤트 */
epoll_data_t data; /* 유저 데이터로 직접 설정가능하다 */ }; epoll_data_t를 유심히 볼필요가 있다. 이것은 유저 데이터가 직접 설정이 가능한데, 여기에서 설정한 값은 epoll_wait를 통해서 넘어오는 epoll_event구조체값으로 그대로 사용할 수 있다. 예를들어 여기에 pid값이라든지 소켓지정번호등을 지정해 놓게되면 나중에 이벤트가 발생했을 때 이벤트가 발생한 파일등에 대한 정보를 쉽게 얻어올 수 잇다.
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;
struct epoll_event {
__uint32_t events; /* 발생된 이벤트 */
epoll_data_t data; /* 유저 데이터로 직접 설정가능하다 */ }; epoll_data_t를 유심히 볼필요가 있다. 이것은 유저 데이터가 직접 설정이 가능한데, 여기에서 설정한 값은 epoll_wait를 통해서 넘어오는 epoll_event구조체값으로 그대로 사용할 수 있다. 예를들어 여기에 pid값이라든지 소켓지정번호등을 지정해 놓게되면 나중에 이벤트가 발생했을 때 이벤트가 발생한 파일등에 대한 정보를 쉽게 얻어올 수 잇다.
op는 다음과 같은 종류의 작업명령들을 가지고 있다. poll(2)와 비교해보면 매우 유사함을 알 수 있을 것이다.
- EPOLL_CTL_ADDfd를 epoll 이벤트 풀에 추가하기위해서 사용한다.
- EPOLL_CTL_DELfd를 epoll 이벤트 풀에서 제거하기 위해서 사용한다.
- EPOLL_CTL_MOD이미 이벤트 풀에 들어 있는 fd에 대해서 event의 멤버값을 변경하기 위해서 사용한다.
- EPOLLIN입력(read)이벤트에 대해서 검사한다.
- EPOLLOUT출력(write)이벤트에 대해서 검사한다.
- EPOLLERR파일지정자에 에러가 발생했는지를 검사한다.
- EPOLLHUPHang up이 발생했는지 검사한다.
- EPOLLPRI파일지정자에 중요한 데이터가 발생했는지 검사한다.
- EPOLLET파일지정자에 대해서 Edge 트리거 행동을 설정한다. Level 트리거가 기본설정 된다.
댓글
댓글 쓰기