libevent
라이브러리는 기본 네트워크 백엔드 주위에서 랩퍼 역할을 하는 이벤트 메커니즘을 제공한다libevent
라이브러리가 실제로는 select()
, poll()
또는 다른 메커니즘의 기초를 대체하지는 못한다.event
: 특정 조건에서 발생되는 사건event_base
: event
들을 관리하기 위한 구조체event_base
libevent
를 사용하기 전, 하나 혹은 그 이상의 event_base_structure
를 생성해야 한다. 각각의 event_base_structure
는 설정된 이벤트를 감시하며, Poll 한다.event_base
가 Locking 을 사용한다면 멀티 스레드 환경에서도 안전하게 사용이 가능하지만, 만약 사용하지 않는다면 반드시 싱글 스레드 환경에서만 사용해야 한다.event_base
는 어떤 이벤트들이 준비됐는지 확인하기 위해 “메소드” 혹은 “백엔드”를 사용한다.select
poll
epoll
kqueue
devpoll
evport
win32
event_base
생성struct event_base *event_base_new(void);
event_base_new()
함수는 event_base
를 기본 설정 상태로 생성하고 반환한다.event_base
포인터를 반환하고 에러가 발생하면 NULL을 반환한다.event_base
해제void event_base_free(struct event_base *base);
event_base
의 사용이 끝났다면, event_base_free()
함수를 통해 메모리를 해제해주어야 한다.*base
: 메모리 해제할 event_base
event_base
와 연동된 다른 오브젝트들 까지 메모리 해제가 되는 것이 아니며, 소켓을 종료하는 것이 아니다.event
event
생명주기event
생성struct event *event_new(struct event_base *base, evutil_socket_t fd, short what, event_callback_fn cb, void *arg);
*base
: event
가 포함될 event_base
fd
: read/write 하고자 하는 file descriptor 값what
: flag setcb
: 함수 이벤트가 active 되면, 호출할 함수*arg
: cb 호출 시 cb로 넘겨줄 매개 변수event
포인터, 에러가 발생하면 NULL을 반환한다.flag | 설명 |
---|---|
EV_TIMEOUT | event_add 함수에 같이 설장한 시간 뒤에 active 된다. |
EV_READ | 등록한 file descriptor가 Read 가능한 상태일 때 active 된다. |
EV_WRITE | 등록한 file descriptor가 Write 가능한 상태일 때 active 된다. |
EV_SIGNAL | 등록한 시그널이 감지될 때 active 된다. |
EV_PERSIST | 해당 이벤트는 영구적임을 나타난다. |
EV_ET | event_base 의 백엔드가 Edge-trigger 를 지원할 때, 해당 이벤트가 Edge-triggered 를 사용한다는 것을 나타낸다. EV_READ/EV_WRITE 의 Edge-trigger 버전이다. |
event
해제void event_free(struct event *event);
*event
: 메모리 해제할 eventevent
를 event_base
loop에 추가int event_add(struct event *ev, const struct timeval *tv);
*ev
: pending 상태를 만들기 위한 event
*tv
: 설정한 값의 시간(seconds, microseconds) 후에 active 된다.event
를 event_bass
loop에서 삭제int event_del(struct event *ev);
*ev
: non-pending 상태를 만들기 위한 eventflag | 설명 |
---|---|
EVLOOP_ONCE | event_base 에 등록된 이벤트들중 하나 혹은 하나이상의 이벤트가 “active” 될 때까지 대기를 한다. 이후 active 된 이벤트를 실행한다. 실행할 active된 이벤트가 없으면 반환한다. |
EVLOOP_NONBLOCK | event_base 에 등록된 이벤트가 “trigger” 될 때까지 대기하지 않고 즉시 “trigger”된 이벤트만 확인한 후 active된 이벤트를 실행하고 반환한다. |
EVLOOP_NO_EXIT_ON_EMPTY | event_base_loopbreak(), event_base_loopexit() 를 호출하거나 에러가 발생하지 않는 이상, 계속해서 루프를 돌게 된다. |