본문 바로가기
C_C++ 프로그래밍

epoll 함수와 구조체에 대해서 알아보자

by RoJae 2019. 6. 8.

      로재의 개발 일기      

epoll?

 select나 poll과 비슷하게 관심 있는 파일 디스크립터를 모두 등록하고 이벤트 발생을 감지하는 것에는 차이는 없지만

epoll은 사건이 발생한 fd들만의 구조체 배열을 셋팅하여 관리한다.

=>  상태 변화에 대해서 일일이 확인이 필요한 전체 파일 디스크립터를 대상으로 반복문을 돌려 일일이 확인할 필요가 없다

1
2
3
4
5
6
7
8
9
10
11
12
typedef union epoll_data{
    void *ptr;
    int fd;            // 이벤트가 일어나게 될 파일 디스크립터
    _unit32_t u32;
    _unit64_t u64;
} epoll_data_t;
 
 
struct epoll_event{
    __unit32_t events;    // 관찰한 이벤트
    epoll_data_t data;
}
cs




epoll_create (파일 디스크립터의 저장소를 생성한다)-> epoll_ctl (관찰 대상을 등록) -> epoll_wait (변화를 대기한다)

  epoll_create

1
2
#include<sys/epoll.h>
int epoll_create(int size)
cs

성공 : epoll 파일 디스크립터 반환

실패 : -1 반환



  epoll_ctl

1
2
#include<sys/epoll.h>
int epoll_ctl(int epfd, int op, struct epoll, struct epoll_event *event);
cs

epfd : 상태 변화를 등록할 epoll 인스턴스의 파일 디스크립터

op  : 등록하거나 삭제하거나 이벤트 상황을 변경할 수 있다.

EPOLL_CTL_ADD : 파일 디스크립터를 epoll에 등록한다.

EPOLL_CTL_DEL : 파일 디스크립터를 epoll에서 삭제한다.

EPOLL_CTL_MOD : 등록된 파일 디스크립터의 이벤트 발생 상황을 변경

fd : 등록할 관찰 대상의 파일 디스크립터

event : 관찰 대상의 관찰 이벤트 유형



  epoll_wait

1
2
#include<sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event *event, int maxevents, int timeout);
cs


epfd : 이벤트 발생의 관찰 영역인 epoll 인스턴스의 파일 디스크립터
events : 이벤트가 발생한 파일 디스크립터가 채워 질 버터의 주소의 값
maxevents : 두 번째 인자로 전달된 주소 값의 버퍼에 등록 가능한 최대 이벤트
timeout : 1/1000초 단위의 대기 시간, -1 전달 시 이벤트가 발생할 때까지 무한 대기

성공 :  준비된 파일 디스크립터 수 리턴
0 : 타임아웃
-1 : 에러


참고


※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다


댓글