高性能,分布式,轻量级缓存组件memcached的源码剖析---第二篇,libevent
www.firnow.com 时间 : 2007-10-09 作者:佚名 编辑:本站 点击: [ 评论 ]
step0: 概述
关于libevent, 先摘来网上某哥们一段描述:
libevent是一个跨平台的事件驱动库,他目前支持Linux, *BSD, Mac OS X, Solaris 和 Windows。如果你将要开发的应用程序需要支持以上所列出的平台中的两个以上,那么强烈建议你采用这个库,即使你的应用程序只需要支持一个平台,选择libevent也是有好处的,因为它可以根据编译/运行环境切换底层的事件驱动机制,这既能充分发挥系统的性能,又增加了软件的可移植性。
它封装并且隔离了事件驱动的底层机制,除了一般的文件描述符读写操作外,它还提供有读写超时、定时器和信号回调,另外,它还允许为事件设定不同的优先级,当前版本的libevent还提供dns和http协议的异步封装,这一切都让这个库尤其适合于事件驱动应用程序的开发。
step1: 使用方法介绍
OK,理论到位了,接下来简单介绍下libevent中几个核心函数:
event_set(&c->event, sfd, event_flags, event_handler, (void *)c)
把sfd这个文件描述符放入c->event,并且告知当事件event_flags发生时回调event_handler,并以c为回调参数。
event_add(&ev, NULL)
把ev注册到事件队列里面,第二个参数指定的是超时值,设定成NULL表示忽略这项设定。
event_dispatch()
表示进入事件循环,当队列里任何一个文件描述符发生事件的时候就会执行回调函数。
step2: 演示例子
下面举个小例子,就timer server吧,比较SB易懂咯,赶紧贴上源码:
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <time.h>
#include <event.h>


void connection_time(int fd, short event, struct event *arg)...{
char buf[32];
struct tm t;
time_t now;
time(&now);
localtime_r(&now, &t);
asctime_r(&t, buf);
write(fd, buf, strlen(buf));
shutdown(fd, SHUT_RDWR);
free(arg);
}

void connection_accept(int fd, short event, void *arg)...{
&nbs