| 검색 | ?

libevent 분석

1.1. 시작하기에 앞서

libevent는 특정 event가 파일지시자(fd, file descriptor) 또는 주어진 시간이 경과되었을때 또는 signal이 발생하였을때 미리 등록한 callback함수를 통하여 이를 처리할수 있도록 구현된 library 입니다.

이는 대용량 network과 기타 I/O를 유연하게 다룰수 있는 환경을 제공하는데 매우 큰 장점이라 할수 있습니다. 하지만 내부적으로 select, epoll, poll, iocp 등을 근간으로 사용하기 때문에 직접 이를 사용하는것보다 빠른 처리를 제공한다고 볼수는 없습니다.

다만 이러한 여러가지 방법을 한가지의 추상적 interface를 제공하여 매우 유연성을 확보해준다는 것에 큰 이점을 가지고 접근할수 있는 것이라고 할수 있겠습니다.

필자는 이 훌륭한 library를 사용하기에만 급급해 하지 말고 내부 구조를 명확히 파악하여 공부할 필요가 있다고 권하고 싶네요.

1.2. 사용하기 위한 준비

먼서 libevent 를 [http]http://libevent.org/[] 에서 다운로드 받아서 빌드후에 설치합니다. (여기서 이 문서를 작성할 시점에서는 [https]libevent-2.0.21-stable.tar.gz[]을 기준으로 한 것임을 밝힙니다.)

libevent 를 이용하는 소스는 반드시 다음과 같은 header 를 포함하여야 합니다.
#include <sys/time.h>
#include <event.h>


용어정의
  • event : 특정 조건에서 발생되는 사건
  • event base : libevent가 event들을 하나의 구조체로 통합하여 관리하게 되는데 이것이 event base 라고 합니다.

1.3.1. void event_init();

libevent를 사용하기에 앞서서 초기화 해주기 위하여 event_init 함수를 호출해주어야 합니다. 이는 전역 event base를 초기화 하는 역할을 수행하는데 libevent는 전역 event base를 사용하는 함수군과 할당 event base를 사용하는 함수군이 나뉘어져 있습니다. 일반적으로 전역 event base만 사용해도 크게 불편함이 없습니다.
event_init();

1.3.2. int event_dispatch();

event를 실제로 처리하는 함수가 event_dispatch 함수입니다. 이 함수는 event_loop(0) 을 호출하는 것과 같은 기능을 하는데 event 처리중에 오류가 발생할때에만 반환을 하게 됩니다.

1.3.3. int event_loop(int flags);

event들에 대한 1회의 실행루프를 제공하며 flags 인자로 EVLOOP_ONCE, EVLOOP_NONBLOCK을 지정할수 있습니다. 만약 flags를 0으로 지정하면 event_dispatch함수와 동일한 역할을 합니다.

1.3.4. void event_set(struct event ∗ev, int fd, short event, void (∗fn)(int, short, void ∗), void ∗arg);

ev 구조체를 초기화 하는 역할을 합니다. 함수의 event 인자로는 EV_READ, EV_WRITE, EV_PERSIST 등이 지정될수 있으며 감시하고자 하는 event의 성격이라고 할수 있습니다. 해당 event가 발생하면 호출될 fn도 지정하게 되는게 이게 가장 중요한 역할을 실제로 수행하도록 우리가 짜 넣어야 하는 함수가 되겠습니다.

1.3.5. int event_add(struct event ∗ev, struct timeval ∗tv);

전역 event base에 ev를 등록합니다. tv인자를 이용하여 timeout을 제어할수 있습니다.

1.3.6. int event_del(struct event ∗ev);

전역 event base로부터 ev를 등록해제 합니다.

1.3.7. int event_pending(struct event ∗ev, short event, struct timeval ∗tv);

함수의 인자 event가 지정하는 사건을 대기하고 있는지 여부를 검사하는데 사용하며 만약 EV_TIMEOUT옵션이 지정되고 tv가 NULL이 아니라면 tv에는 timeout될때까지 남은 시간을 반환합니다.

1.3.8. int event_initialized(struct event ∗ev);

지정한 ev구조체가 초기화 되었는지 여부를 반환합니다.

1.3.9. void evtimer_set(struct event ∗ev, void (∗fn)(int, short, void ∗), void ∗arg);

1.3.10. void evtimer_add(struct event ∗ev, struct timeval ∗);

1.3.11. void evtimer_del(struct event ∗ev);

1.3.12. int evtimer_pending(struct event ∗ev, struct timeval ∗tv);

1.3.13. int evtimer_initialized(struct event ∗ev);

1.3.14. void signal_set(struct event ∗ev, int signal, void (∗fn)(int, short, void ∗), void ∗arg);

1.3.15. void signal_add(struct event ∗ev, struct timeval ∗);

1.3.16. void signal_del(struct event ∗ev);

1.3.17. int signal_pending(struct event ∗ev, struct timeval ∗tv);

1.3.18. int signal_initialized(struct event ∗ev);

1.3.19. int (∗event_sigcb)(void);

1.3.20. int event_gotsig;



Copyright ⓒ MINZKN.COM
All Rights Reserved.