学会使用libevent,才能真正的掌握其是实现原理,我们先从一个简短的测试用例开始:

   #include <sys/types.h>
#include <sys/stat.h>
#include <sys/queue.h>
#include <unistd.h>
#include <sys/time.h> #include <signal.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <event.h> int called = ;
static void signall_cb(int fd, short event, void *arg)
{
struct event *signal = arg;
printf("%s: got signal %d\n", __func__, EVENT_SIGNAL(signal));
if (called >= )
event_del(signal);
called++;
}
int main (int argc, char **argv)
{
struct event signal_int;
/* Initalize the event library */
event_init();
/* Initalize one event */
event_set(&signal_int, SIGINT, EV_SIGNAL|EV_PERSIST, signall_cb, &signal_int);
event_add(&signal_int, NULL);
event_dispatch();
return ();
}

该代码的大体意思是:添加一个信号中断事件,通过CTRL+C,产生中断信号,再调用中断处理函数。

首先分析的是函数是event_init函数,现帖出其具体实现方式


 struct event_base *
event_base_new(void)
{
int i;
struct event_base *base; if ((base = calloc(, sizeof(struct event_base))) == NULL)
event_err(, "%s: calloc", __func__); event_sigcb = NULL;
event_gotsig = ; detect_monotonic();
/*如果第一次使用初始化,需要将时间缓存保留,在event_base中保留了一个事件*/
gettime(base, &base->event_tv);
/*初始化最小堆,这个堆里存储的是时间,在I/O复用的函数里是使用最小堆中堆顶的值
210 作为等待的时间参数,这里只介绍epoll_wait作为I/O复用的方法,这个值就是函数的最后
211 一个参数,当等待的时间结束,函数返回,也就代表着可能是定时事件被激活
212 这样也将定时事件集合到I/O事件*/
min_heap_ctor(&base->timeheap);
/*宏作为初始化的,eventqueue是一个event_list,这里面存储着这个event_base所关注的
215 所有事件*/
TAILQ_INIT(&base->eventqueue);
/*这一对套接字是为了将信号事件融合到I/O事件中所特有的,将其中一个套接字添加到被关注的
218 行列中,信号事件是通过这一对套接字上来传递的,信号到达,其中一个套接字上有I/O事件,
219 那么信号到达可以让I/O返回,这样便可将信号事件添加到激活队列中去........*/
base->sig.ev_signal_pair[] = -;
base->sig.ev_signal_pair[] = -; base->evbase = NULL;
/*寻找合适的I/O复用机制,在这里说明,libevent库使用的I/O机制是在编译的时候确定的
225 其实evbase和某一个复用机制的关系就像类和对象的关系一样,复用机制是evbase的具体实现
226 */
printf("default is selected %d %d %d\n", HAVE_EPOLL, :qHAVE_POLL, HAVE_SELECT); /*eventops 是一个全局的结构体,结构体中都是不同内核所支持的几种I/O复用机制*/
for (i = ; eventops[i] && !base->evbase; i++) {
base->evsel = eventops[i];

libevent 信号事件实现方式的更多相关文章

  1. libevent(七)信号事件监听

    libevent通过socketpair实现对信号事件的监听. 还记得event_base吗? struct event_base { struct evsig_info sig; // 略 }; e ...

  2. libevent(六)事件监听

    libevent是如何实现事件监听的呢? 在Linux,libevent的底层实现是epoll,因此实现事件监听的方式就是,把需要监听的fd加入epoll中. I/O事件 定时器事件 定时器事件没有f ...

  3. Ngui 五种点击事件实现方式及在3d场景中点透的情况

    http://www.unity蛮牛.com/thread-22018-1-1.html ngui作为unity界面插件之一中,无疑是最好用,使用最多的了从自学unity到现在界面一直使用它 由于它的 ...

  4. 正确处理WPF中Slider值改变事件的方式

    最近在用WPF数据绑定重写一下播放器项目时遇到的关于Slider的问题,在窗体透明度调节和播放进度调节上用了Slider控件.调节窗体透明度我是 这么想的:将窗体的Opacity属性的值与Slider ...

  5. jQuery绑定事件-多种方式实现

    jQuery绑定事件-多种方式实现: <html> <head> <meta charset="utf-8" /> <script src ...

  6. javascript事件小结(事件处理程序方式)--javascript高级程序设计笔记

    1.事件流:描述的是从页面中接收事件的顺序. 2.事件冒泡:IE的事件流叫做事件冒泡,即事件开始从具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到不具体的节点(文档). 3.事件捕获 ...

  7. javaScript事件机制深入学习(事件冒泡,事件捕获,事件绑定方式,移除事件方式,阻止浏览器默认行为,事件委托,模拟浏览器事件,自定义事件)

    前言 JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间.可以使用侦听器(或处理程序)来预订事件,以便事件发生时执行相应的代码.这种在传统软 ...

  8. 关于Unity中NGUI的Checkbox复选框、Slider滑动条和Button的6种触发回调事件的方式

    Checkbox复选框 1.创建一个NGUI背景Sprite1节点 2.打开NGUI---->Open---->Prefab Toolbar---->选择一个复选框节点,拖拽到背景节 ...

  9. Android中加载事件的方式

    Android中加载事件的方式 通过内部类的方式实现 通过外部类的方式实现 通过属性的方式实现 通过自身实现接口的方式实现 通过内部类的方式实现 Demo btn_Login.setOnClickLi ...

随机推荐

  1. javascript模块化编程规范

    一.javascript模块化编程规范: 二.关于commenjs规范和AMD规范: 根本不同:前者用于服务器端同步加载模块:后者是客户端异步加载模块. 同点:两者都有一个全局函数require(), ...

  2. ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第十二天(非原创)

    文章大纲 一.课程介绍二.Ngnix基础知识学习三.Ngnix在淘淘商城中使用四.参考资料下载五.参考文章 一.课程介绍 一共14天课程(1)第一天:电商行业的背景.淘淘商城的介绍.搭建项目工程.Sv ...

  3. linux下安装redis和部署

    转自简书:https://www.jianshu.com/p/bc84b2b71c1c 1.基础知识  redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.它通过提供多种键值 ...

  4. Android在应用设置里关闭权限,返回生命周期处理

    问题 在处理6.0运行时权限时,很多人都忽略了这样一个问题: 在一个App应用里,如果已经允许了一个权限比如(读取通讯权限),此刻去调用相机,弹出权限申请对话框,此刻点击拒绝,然后经过处理后弹出去设置 ...

  5. 【Mood-14】龙虎榜 活跃在github中的1000位中国开发者

    Last cache created on 2015-01-07 by Github API v3. ♥ made by hzlzh just for fun. Rank Gravatar usern ...

  6. Android应用瘦身

    转:https://zhuanlan.zhihu.com/p/25465537 瘦身的目的 从目的导向来看,我们是不会无缘无故去做一件事情的,那我们对应用瘦身的目的是为了什么?答案是:提高下载转化率. ...

  7. Spring之IOC核心模块详解

    Spring IOC简述 IOC称为控制反转,也有一种说法叫DI(依赖注入).IOC也是spring最核心的模块,Spring的所有工作几乎都围绕着IOC展开. 什么是控制反转呢?简单的说,控制反转就 ...

  8. PHP的模板引擎smarty原理浅谈

    mvc是开发中的一个伟大的思想,使得开发代码有了更加清晰的层次,让代码分为了三层各施其职.无论是对代码的编写以及后期的阅读和维护,都提供了很大的便利. 我们在php开发中,视图层view是不允许有ph ...

  9. jQuery_2_常规选择器-进阶选择器

    进阶选择器: 1. 群组选择器     $("span,em,#box")   获取多个选择器的DOM对象 <div id="d1">div< ...

  10. [转]iOS开发总结之代码规范

    转自:http://www.cocoachina.com/ios/20151014/13678.html 命名规范 总 的来说, iOS命名两大原则是:可读性高和防止命名冲突(通过加前缀来保证). O ...