Linux c- libevent

      libevent是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。著名分布式缓存软件memcached也是libevent based,并且libevent在使用上能够作到跨平台,并且根据libevent官方网站上公布的数据统计,彷佛也有着非凡的性能。php

     例如 : 客户端链接到服务端属于一个链接的事件,当这个事件触发的时候就会去处理。linux

     event_base是event的一个集合,主要是用来管理和实现事件的监听循环。通常状况下一个线程一个event_base,多个线程的状况下须要开多个event_base。windows

 建立event_base          缓存

struct event_base *event_base_new(void); 

销毁event_base网络

void event_base_free(struct event_base *base);

初始化event_basesocket

int event_reinit(struct event_base *base);

销毁event_base分布式

void event_base_free(struct event_base *base); 

 

      IO多路复用模型中 (IO模型文章),有多种方法能够供咱们选择,可是这些模型是在不一样的平台下面的: select  poll  epoll  kqueue  devpoll  evport  win32memcached

      当咱们建立一个event_base的时候,libevent会自动为咱们选择最快的IO多路复用模型,Linux下通常会用epoll模型。函数

获取io多路复用模型名称oop

const char *event_base_get_method(const struct event_base *base); 

 

      事件循环监听event_loop    event_base是须要监听的event事件集合,须要循环被监听

监听函数 

int event_base_dispatch(struct event_base *base);
int event_base_loop(struct event_base *base, int flags);  

 

 

 

event事件

even_base中的基本单元,事件。

例如 socket进行网络开发的时候,都会使用accept这个方法来阻塞监听是否有客户端socket链接上来,若是客户端链接上来,则会建立一个线程用于服务端与客户端进行数据的交互操做,而服务端会继续阻塞等待下一个客户端socket链接上来,客户端链接到服务端实际就是一种事件。

建立event

struct event *event_new(struct event_base *base, evutil_socket_t fd,short what, event_callback_fn cb,void *arg);  

参数:

1. base:即event_base

2. fd:文件描述符。

3. what:event关心的各类条件。

4. cb:回调函数。

5. arg:用户自定义的数据,能够传递到回调函数中去。

libevent是基于事件的,也就是说只有在事件到来的这种条件下才会触发当前的事件。例如:

1. fd文件描述符已准备好可写或者可读

2. fd立刻就准备好可写和可读。

3. 超时的状况 timeout

4. 信号中断

5. 用户触发的事件

 

释放event_free

 
void event_free(struct event *event); 

注册event

int event_add(struct event *ev, const struct timeval *tv);

信号事件   信号事件也能够对信号进行事件的处理。用法和event_new相似。只不过处理的是信号

// base --- event_base  
// signum --- 信号,例如 SIGHUP  
// callback --- 信号出现时调用的回调函数  
// arg --- 用户自定义数据  
evsignal_new(base, signum, cb, arg)  
       
//将信号 event 注册到 event_base  
evsignal_add(ev, tv)   
       
// 清理信号 event  
evsignal_del(ev)

 

1. 每个事件event都须要经过event_new初始化生成。event_new生成的事件是在堆上分配的内存。

2. 当一个事件经过event_add被注册到event_base上的时候,这个事件处于pending(等待状态),当只有有事件进来的时候,event才会被激活active状态,相关的回调函数就会被调用。

3. persistent 若是event_new中的what参数选择了EV_PERSIST,则是持久的类型。持久的类型调用玩回调函数后,会继续转为pending状态,就会继续等待事件进来。大部分状况下会选择持久类型的事件。

3. 而非持久的类型的事件,调用玩一次以后,就会变成初始化的状态。这个时候须要调用event_add 继续将事件注册到event_base上以后才能使用。

相关文章
相关标签/搜索