libevent学习四(Working with events)

1.事件的分类

  1. 文件可写
  2. 文件可读
  3. 超时发生
  4. 信号发生
  5. 用户触发事件

2事件的生命周期

--非 persistent

 

                                                             event_del(nopending)                                           在callback中通过event_add(重新pending)构成循环

                                                                             ^                                                                     ^

                                                                              |                                                                       |

event_new(initialized)---->event_add(pending)-->事件发生(active)-->callback被调用(stoping)-->event_free(destory)

----persistent

event_del(nopending)

^

|

event_new(initialized)-->event_add(pending)->事件发生(active)-->callback被调用(pending)和第二步构成循环->event_free(destory)

  1. 事件状态

EV_TIMEOUT:事件超时,应该在event_add的第二个参数设置。这个时间是相对于上一次active发生call_back调用后的时间

EV_READ:文件可读

EV_WRITE:文件可写

EV_SIGNAL:信号发生在一个进程中只应该有一个event_base监听和处理信号,即便有多个,也只有一个会收到信号(即使信号不一样))

EV_PERSIST:保持pending状态,事件可被多次激活

Thus, if you have an event with flags EV_READ|EV_PERSIST and a timeout of five seconds, the event will become active:

  • Whenever the socket is ready for reading.
  •                                   Whenever five seconds have passed since the event last became active.

EV_ET:边缘触发。(状态满足触发一次,而不是条件满足多次触发)

接口

#define EV_TIMEOUT      0x01
#define EV_READ         0x02
#define EV_WRITE        0x04
#define EV_SIGNAL       0x08
#define EV_PERSIST      0x10
#define EV_ET           0x20

typedef void (*event_callback_fn)(evutil_socket_t, shortvoid *);

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

void event_free(struct event *event);

 

 

//把事件本身作为回调函数的参数,需要使用下面的api

void *event_self_cbarg();

//辅助宏

//超时只会被激活一次

#define evtimer_new(base, callback, arg) \
    event_new((base), -1, 0, (callback), (arg))
#define evtimer_add(ev, tv) \
    event_add((ev),(tv))
#define evtimer_del(ev) \
    event_del(ev)
#define evtimer_pending(ev, tv_out) \

    event_pending((ev), EV_TIMEOUT, (tv_out))

 

 

#define evsignal_new(base, signum, cb, arg) \

    event_new(base, signum, EV_SIGNAL|EV_PERSIST, cb, arg)

 

 

 

struct event *hup_event;
struct event_base *base = event_base_new();

/* call sighup_function on a HUP signal */

hup_event = evsignal_new(base, SIGHUP, sighup_function, NULL);

 

#define evsignal_add(ev, tv) \
    event_add((ev),(tv))
#define evsignal_del(ev) \
    event_del(ev)
#define evsignal_pending(ev, what, tv_out) \
    event_pending((ev), (what), (tv_out))

时间: 2024-08-09 22:02:06

libevent学习四(Working with events)的相关文章

libevent学习四

构建event_base 在你开始使用任何Libevent前,你需要先创建一个或多个event_base.每个event_base管理着一个event的集合,并可以检测出哪些event被激活了.如果event_base使用了锁,就可以在多线程中安全的访问它.但要注意它的主poll函数只能被单个线程运行.如果你想用多个线程运行IO迭代器,你需要为每个线程分配一个event_base. 注:在以后的版本中,Libevent可能提供对跨线程event的支持. 每个event_base都有一个"方法&q

ZigBee学习四 无线+UART通信

ZigBee学习四 无线+UART通信 1) 协调器编程 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique message ID (counter) afAddrType_t GenericApp_DstAddr; //unsigned char uartbuf[128];/********************************************************************** L

Android Camera fw学习(四)-recording流程分析

Android Camera fw学习(四)-recording流程分析 备注:备注:本文是Android5.1学习笔记.博文按照软件启动流程分析.  且行且惜,一步一个脚印,这次学习camera Video.虽然标题是recording流程分析,但这里很多和preview是相似的(包含更新,创建Stream,创建Request),这里主要分析MediaRecorder对象创建.video帧监听对象注册.帧可用事件以及一系列callback流程分析. 一.认识video(mediaRecorde

nodejs学习四 Node.js NPM

什么是NPM? 不知道大家注意没有,windows平台下的Node.js安装包大小才区区4M多,真可以用短小精悍来形容它,作为一种编程语言,像java一个SDK 就几十M,为什么node.js的运行环境这么小呢?这其中的微妙之处在于,它拥有一个庞大的第三方软件库. 在Node本身提供的包(原生)中没有我们要实现的功能模块的时候,我们可以去寻找下是否已经有人实现了这种功能.毕竟重复造轮子这种事情,很多人都不想干. 去哪里寻找我们想要的包呢?如果你还不知道报的名字,你可以去https://www.n

libevent学习之二:Windows7(Win7)下编译libevent

Linux下编译参考源码中的README文件即可,这里主要记录Windows下的编译. 一.准备工作 去官网下载最新的稳定发布版本libevent-2.0.22-stable 官网地址:http://libevent.org/ 二.使用VS2012编译 1.解压libevent到C:\Users\zhang\Desktop\libevent-2.0.22-stable 2.打开“VS2012开发人员命令提示”工具,如下图所示. 3.输入指令开始编译,如下图所示. 有网友说编译之前应该在以下3个文

Spark学习四:网站日志分析案例

Spark学习四:网站日志分析案例 标签(空格分隔): Spark Spark学习四网站日志分析案例 一创建maven工程 二创建模板 三日志分析案例 一,创建maven工程 1,执行maven命令创建工程 mvn archetype:generate -DarchetypeGroupId=org.scala-tools.archetypes -DarchetypeArtifactId=scala-archetype-simple -DremoteRepositories=http://scal

Beaglebone Back学习四(GPIO实验)

GPIO Beaglebone Back开发板引出了92个引脚,其中只有65个GPIO口可通过配置使用,由于引脚具有"复用"的特性,大约每个引脚有8种工作模式(Beagle System Reference Manual),默认情况下,设为Mode7.由于P8扩展部分的引脚功能相对简单,复用不多,故项目功能复杂时,最好选择P8上的GPIO口. 对GPIO口的操作,主要有三个步骤 1 选择GPIO口根据以下两表,确定使用那个GPIO口,该表也可以在BBB_SRM文件中找到. (1)拉电流

Silverlight学习(四) domainservice动态多条件查询

上次讲了silverlight+MVVN+EF的简单框架,能够实现简单的数据CURD,但是多条件动态的查询一直没有实现.在网上查阅了很多资料,发现自己走了很多误区,代码很难调试正确. 这次的查询是基于上次的查询,只是增加了一个查询条件,动态多条件的查询的重点是获取查询的语言. 1 private string GetSql() 2 { 3 string query = "1=1"; 4 if (!string.IsNullOrEmpty(searchText.name)) 5 { 6

Gradle学习(四) web工程构建

Gradle为应用开发提供了两个相关的插件:war plugin以及jetty plugin war plugin继承了java plugin为你的工程构建war包,jetty pugin继承了war plugin可以让的工程构建在嵌入式容器jetty中 构建War文件 首先在你的build.gradle中添加如下一行 apply plugin: 'war' 由于war plugin继承了java plugin,所有java plugin也会被默认的加入配置文件中 运行gradle build命