blog.bundles.dev

Libevent 기초

개요

주요 구성요소

event_base

event_base 생성

struct event_base *event_base_new(void);

event_base 해제

void event_base_free(struct event_base *base);

event

event 생명주기

./event-lifecycle.png

event 생성

struct event *event_new(struct event_base *base, evutil_socket_t fd, short what, event_callback_fn cb, void *arg);
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);

eventevent_base loop에 추가

int event_add(struct event *ev, const struct timeval *tv);

eventevent_bass loop에서 삭제

int event_del(struct event *ev);

event loop 동작

loop의 기본 흐름(flags 미포함)

./event-loop-basic-flow.png

flag 설명
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() 를 호출하거나 에러가 발생하지 않는 이상, 계속해서 루프를 돌게 된다.

loop 흐름(flags 포함)

./event-loop-include-flag.png