libev学习笔记(持续更新) ------good入门好文

from http://blog.csdn.net/wusuopubupt/article/details/39031261


==libev学习笔记 == 

参考:
1. http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod
2. 


简介:
libev - a high performance full-featured event loop written in C


libev是Marc Lehmann用C写的高性能事件循环库。通过libev,可以灵活地把各种事件组织管理起来,如:时钟、io、信号等。libev在业界内也是广受好评,不少项目都采用它来做底层的事件循环。
libev所实现的功能就是一个强大的reactor,可以notify的事件主要包括下面这些:

ev_io                 // IO可读可写
ev_stat               // 文件属性变化
ev_signal             // 信号处理
ev_timer              // 相对定时器
ev_periodic           // 绝对定时器
ev_child              // 子进程状态变化
ev_fork               // fork事件
ev_cleanup            // event loop退出触发事件
ev_idle               // event loop空闲触发事件
ev_embed              // 嵌入另一个后台循环
ev_prepare            // event loop之前事件
ev_check              // event loop之后事件
ev_async              // 线程间异步事件


1. 一些宏定义:
/* support multiple event loops */
#if EV_MULTIPLICITY
struct ev_loop;
# define EV_P  struct ev_loop *  loop               /* a loop as sole parameter in a declaration */
# define EV_P_     EV_P,                              /* a loop as first of multiple parameters */
# define EV_A  loop                               /* a loop as sole argument to a function call */
# define EV_A_     EV_A,                              /* a loop as first of multiple arguments */


ev_loop是主循环,而EV_MULTIPLICITY是一个条件编译的宏,表明是否支持有多个ev_loop实例存在,一般来说,每个线程中有且仅有一个ev_loop实例。
如果整个程序是单线程的,程序中使用全局默认的ev_loop即可,不需要在函数中传参。

而在多线程中调用函数很多时候都要指定函数操作的loop。
比如启动一个io事件,调用的函数是void ev_io_start (EV_P_ ev_io *w),如果没有定义EV_MULTIPLICITY,将会编译成ev_io_start(io  *w),
否则会编译成ev_io_start(struct ev_loop *loop,   ev_io *w)。 对于每一种事件,都有结构体ev_TYPE与之对应,比如ev_io,ev_timer等。
为了统一事件结构,libev在C中使用结构体布局实现了多态,可以将ev_watcher结构体看做所有ev_TYPE结构体的基类,它包含了所有ev_TYPE中相同的字段。


2. libev设置用户自定义数据: 
void ev_set_userdata (loop, void *data)  /* set userdata=data */
void *ev_userdata (loop)/* return userdata */


3. ev_loop_fork(loop):
/* support multiple event loops */
while(i < PROCESS_NUM){
int pid = fork();
if(pid == 0){
ev_loop_fork(loop);
}
}


4. ev_io:
ev_io的主要使命就是监听并响应指定文件描述fd上的读写事件。对fd的监听工作,主要委托给底层的io库来完成。libev对目前比较流行的io库都提供了支持,如:select, epoll以及windows的iocp等。在这里libev使用了Adaptor模式,
通过统一的适配层隐藏了底层io库的细节。


手册上ev_io的介绍:
I/O watchers check whether a file descriptor is readable or writable in each iteration of the event loop, or, more precisely, when reading would not block the process and writing would at least be able to write some data. This behaviour is called level-triggering because you keep receiving events as long as the condition persists.

/* invoked when fd is either EV_READable or EV_WRITEable */  //当fd可读或可写的时候,触发
/* revent EV_READ, EV_WRITE */  //事件:读或写
typedef struct ev_io
{
 EV_WATCHER_LIST (ev_io)   //事件监听器 列表


 int fd;     /* ro */
 int events; /* ro */
} ev_io;


5. ev_io_init(ev, cb, fd, events)   //注册事件
#define ev_io_init(ev,cb,fd,events)          do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0)
 例如:
          ev_io*  read_ev_io = (ev_io*) malloc(sizeof(ev_io));
          ev_io_init(read_ev_io,  mysql_libev_read_callback,  mysql_get_file_descriptor(MySQL),  EV_READ);    //注册事件


6. ev_io_start(loop, ev)  //开始监听
   接上例:  ev_io_start(loop,read_ev_io)


7. ev_io_stop(loop, ev)   //停止监听
   接上例: ev_io_stop(loop, read_ev_io)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值