Linux:libevent的使用

1.I/O框架库的概述
I/O框架库以库函数的形式,封装了较为底层的系统调用,给应用程序提供了一组更便于使用的接口。
(1)句柄(文件描述符)
I/O框架库要处理的对象,即I/O事件、信号和定时事件,同意成为事件源。
(2)事件多路分发器(I/O复用方法select/poll/epoll)
事件的到来是随机的、异步的。
(3)事件处理器和具体事件处理器(回调函数)
事件处理器执行事件对应的业务逻辑
(4)Reactor
I/O框架的核心
① 注册事件
② 注销事件
③ 事件循环

2.Libevent
(1)在处理I/O事件、信号和定时事件时候需要考虑的问题:
① 统一事件源。
② 可移植性
③ 对并发编程的支持
(2)定义实例/框架
① 注册事件:描述符(sockfd,fd,管道),读事件/写事件,I/O事件,定时器事件,信号事件
定义实例/框架调用select/poll/epoll,在调用就绪的描述符上的回调函数
② 注销事件
③ 事件循环

定义实例-创建事件-注册添加到libevent-事件循环

3.开源库
回调函数

#include<sys/signal.h>
#include<event.h>

void signal_cb(int fd, short event, void* argc)
{
	struct event_base* base = (event_base*)argc;
	struct timeval delay = { 2,0 };
	printf("Caught an interrupt signal;exiting cleanly in two seconds...\n");
	event_base_looexit(base, &delay);
}
void timeout_cb(int fd, short event, void* argc)
{
	printf("timeout\n");
}
int main()//回调函数
{
	struct event_base* base = event_init();//实例指针,malloc申请空间

	struct event* signal_event = evsignal_new(base, SIGINT, signal_cb, base);//具体定义事件名
	event_add(signal_event, NULL);

	timeval tv = { 1,0 };
	struct event* timeout_event = evtimer_new(base, timeout_cb, NULL);//定时器:没有描述符,也不需要传参
	event_add(timeout_event, &tv);

	event_base_dispatc(base);

	event_free(timeout_event);
	event_free(signal_event);
	event_base_free(base);
}

4.自定义库函数

//解释库函数的使用,
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<event.h>
#include<signal.h>

void sig_cb(int fd, short ev, void* arg)
{
	printf("sig=%d\n", fd);
}
void time_cb(int fd, short ev, void* arg)
{
	printf("time out\n");
}
int main()
{
	struct event_base* base = event_init();//libevent实例
	assert(base != NULL);

	//struct event* sig_ev = evsignal_new(base,SIGINT,sig_cb,NULL);//定义事件
	struct event*sig_ev=event_new(base,SIGINT,EV_SIGNAL|EV_PERSIST,sig_cb,NULL)
	assert(sig_ev != NULL);

	event_add(sig_ev, NULL);//添加事件到libevent实例

	struct timeval tv = { 5,0 };
	//struct event* time_ev = evtimer_new(base, time_cb, NULL);
	struct event* time_ev = event_new(base, -1, 0, time_cb, NULL);
	assert(time_ev != NULL);
	event_add(time_ev, &tv);//设置超时事件

	event_base_dispatch(base);//启动事件循环

	event_free(sig_ev);
	event_free(time_ev);
	event_base_free(base);

	exit(0);
}
上一篇:Linux环境下MySQL的安装、密码策略、忘记密码后的破解及用户授权等。


下一篇:android 单选按钮、复选按钮的使用