libevent-빠른 시작

5893 단어
libevent – 빠른 입문 1. 소개libevent는 c 언어로 작성된 이벤트 드라이브 라이브러리로 경량급이며 네트워크에 전념하고 크로스플랫폼 특성이 좋으며 다양한 I/O 다중 복용을 지원합니다. I/O, 타이머와 신호 등 이벤트를 지원하며 등록 이벤트 우선순위를 설정할 수 있습니다.
2. 기본적으로 장면과 이벤트 프로세스를 사용(1) 이벤트 루트(슬롯) 초기화
struct event_base *event_base_new(void); struct event_base *event_init(void); event_base_new () 함수 분배 및 기본 설정이 있는 이벤트base. event_init()에서 이벤트를 호출합니다base_new () 이벤트 생성base, 전역 변수current 초기화base . 예:
struct event_base *base = event_init(); (2) 이벤트 이벤트를 초기화하고 리셋 함수와 관심 이벤트를 설정하며 대응하는 이벤트 루트(슬롯) 이벤트base
typedef void (event_callback_fn)(evutil_socket_t, short, void);
struct event event_new(struct event_base , evutil_socket_t, short, event_callback_fn, void *);
int event_assign(struct event , struct event_base , evutil_socket_t, short, event_callback_fn, void *);
void event_set(struct event *ev, int fd, short events, event_callback_fn, void *arg); void event_base_set(struct event_base ,struct event); event_assign () 의 역할은 주어진 이벤트 유형의 대상의 모든 구성원에게 지정된 값을 부여하는 것이다.
event_new ()의 실현은 사실 간접적으로 호출된 이벤트assign(), 우선 mm 호출malloc에서 메모리를 분배하고 이벤트를 호출합니다assign은 이벤트 유형의 대상의 각 구성원에게 값을 부여합니다.
event_set()는 지정한 핸들, 관심 이벤트, 이벤트 발생 시 리셋 함수, 리셋 함수의 추가 파라미터를 사용하여 struct 이벤트 구조 대상을 초기화하고 전역currentbase, 이 이벤트 구조 대상의 우선순위를 설정합니다. 기본값은currentbase에서 총 유한 급수의 절반
event_base_set () 이벤트를 이벤트 루트에 귀속시킵니다. 이벤트 종속 이벤트base, 이벤트가 어떤 이벤트에 등록되었는지 표시베이스 인스턴스
예:
//SIGINT 신호 이벤트 초기화//이벤트 루트 struct 이벤트가 생성된 것으로 가정base*base//모드 1:struct event sigintev; event_assign(&sigint_ev,base,SIGINT, EV_SIGNAL | EV_PERSIST,sigint_cb,NULL); //방법2:struct event sigintev ; event_set(&sigint_ev, SIGINT, EV_SIGNAL | EV_PERSIST, sigint_cb, NULL); event_base_set(base, &sigint_ev); //방식 3:struct event *sigintev; sigint_ev = event_new(base,SIGINT,EV_SIGNAL | EV_PERSIST, sigint_cb, NULL); //방식 4: struct 이벤트* sigintev = (struct event*)malloc(sizeof(struct event)); //sigint_ev 비공백과 영을 검출한 후 이벤트assign 또는 이벤트set + event_base_set 초기화 이벤트. 타이머 이벤트:
define evtimer_set(ev, cb, arg) event_set(ev, -1, 0, cb, arg)
신호 이벤트:
define evsignal_new(base,signum,cb,arg)\
event_new(base,signum,EV_SIGNAL|EV_PERSIST,cb,arg)

(3) 이벤트를 추가하여 이벤트를 미결 상태로 만듭니다. 즉, 이벤트를 이벤트에 추가합니다.base에서 수신 대기
void event_add(struct event* ,struct timeval *); (4) 프로그램이 무한 순환에 들어가고 이벤트 루트 이벤트베이스에서 작업을 시작하여 등록된 이벤트를 감청합니다. 등록된 이벤트의 대응하는 이벤트 형식이 터치되거나 시간이 초과되면 이벤트에 대응하는 리셋 함수를 자동으로 터치합니다.
void event_base_dispatch(struct event_base *); void event_base_loop(struct event_base *,int ); 3. 입문 예: 파일:test.c
컴파일링:
gcc -o test test.c -levent
코드:
include
include
include
include
include
include
include
include
define BUF_SIZE 1024
typedef struct{ struct event *ev; char *buf; struct timeval *tv; }rw_st;
void wr_cb(int fd, short event, void *arg); void rd_cb(int fd, short event, void *arg);
struct event_base *base = NULL; //정시 이벤트 struct timeval tv;struct event time_ev; void time_cb(int fd, short event, void *arg) { printf(“time_cb : 5s timer wakeup”); event_add(&time_ev,&tv); }
//표준 입력 읽기 이벤트//한 줄을 입력하고 읽기 이벤트를 삭제하고 쓰기 이벤트void rd 추가cb(int fd,short event, void *arg) { if(event & EV_TIMEOUT){ printf(“io read time out(2s)!”); return ; } rw_st* rd_st = (rw_st*)arg; int len = read(fd, rd_st->buf, BUF_SIZE); rd_st->buf[len-1] = ‘\0’; printf(“rd_cb (stdin): %s ”,rd_st->buf);
event_del(rd_st->ev);
event_set(rd_st->ev, STDOUT_FILENO,  EV_WRITE | EV_PERSIST,
                wr_cb,(void*)rd_st);
event_add(rd_st->ev,NULL);

}
//표준 출력 쓰기 이벤트//출력, 쓰기 이벤트 삭제, 읽기 이벤트 추가, 쓰기 하면서void wrcb(int fd, short event, void *arg) { rw_st wr_st = (rw_st)arg; printf(“wr_cb (stdout): %s”,wr_st->buf); memset(wr_st->buf,0,BUF_SIZE); event_del(wr_st->ev); event_set(wr_st->ev, stdIN_FILENO, EV_READ | EV_PERSIST, rd_cb, (void*)wr_st); event_add(wr_st->ev,wr_st->tv); }
//SIGINT 신호 이벤트 void sigintcb(int fd, short event, void *arg) { struct timeval tv_1s = {1,0}; printf(“SIGINT : EXIT IN 1s”); event_base_loopexit(base,&tv_1s); }
//SIGHUB 신호 이벤트 void sighupcb(int fd, short event, void *arg) { printf(“SIGHUP: EXIT AT ONCE”); event_base_loopbreak(base); }
int main() {printf("pid =%ld", getpid(), base = event init();//타이머 tv.tv sec = 5; tv.tv usec = 0; evtimer set(&time ev, time cb, NULL),//일회용, 기본 전역의current base//event set(&time ev, -1, 0, time cb, NULL),
//event_base_set(base, &time_ev);//가성, 여기currentbase는 base event 와 같습니다.add(&time_ev,&tv);
//io         event_new
char buf[1024] = {0};
struct timeval io_tv = {2,0};
rw_st *rd_st = (rw_st*)malloc(sizeof(rw_st));
memset(rd_st,0,sizeof(rw_st));

struct event *io_ev = (struct event*)malloc(sizeof(struct event));
memset(io_ev,0,sizeof(struct event));

rd_st->ev = io_ev;
rd_st->buf = buf;
rd_st->tv = &io_tv;
event_assign(rd_st->ev,base,STDIN_FILENO,
                EV_TIMEOUT | EV_READ | EV_PERSIST,rd_cb,(void*)rd_st);
event_add(rd_st->ev,rd_st->tv);

//SIGINT     
struct event sigint_ev;

event_assign(&sigint_ev,base,SIGINT, EV_SIGNAL | EV_PERSIST,sigint_cb,NULL);

//event_set(&sigint_ev, SIGINT, EV_SIGNAL | EV_PERSIST, //sigint_cb, NULL); //event_base_set(base, &sigint_ev); event_add(&sigint_ev,NULL);
//struct event *sigint_ev = event_new(base,SIGINT, //EV_SIGNAL | EV_PERSIST, sigint_cb, NULL); //event_add(sigint_ev,NULL);
//SIGHUP       
//  : $ kill -SIGHUP pid
struct event *sighup_ev;
sighup_ev = evsignal_new(base, SIGHUP, sighup_cb, NULL);    
event_add(sighup_ev,NULL);

event_base_dispatch(base);
//event_base_loop(base,0);

event_free(sighup_ev);
event_base_free(base);
free(rd_st);

printf("EXIT
"); return 0;

좋은 웹페이지 즐겨찾기