学会使用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];

最新文章

  1. ASP.NET Core 中文文档 第四章 MVC(2.3)格式化响应数据
  2. iOS: setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key name.
  3. Java中将unix时间戳转化为正常显示时间
  4. Codeforces Round #379 (Div. 2) E. Anton and Tree 缩点 直径
  5. LeetCode() Search a 2D MatrixII
  6. eclipse提交subversion+apache的中文路径问题解决过程
  7. iOS-NSString-Base64String-Base64原理
  8. json返回数据拼接HTML
  9. 基于visual Studio2013解决C语言竞赛题之1069链表查找删除
  10. RPi&#160;WiringPi安装使用
  11. POJ 3923 Ugly Windows(——考察思维缜密性的模拟题)
  12. IntelliJ IDEA 2018最新版注册码激活方法
  13. Kubernetes之DaemonSet控制器
  14. 记录-springcloud -mybatis
  15. UVa Live 4794 - Sharing Chocolate 枚举子集substa = (s - 1) &amp; substa,记忆化搜索 难度: 2
  16. input text 去掉标签下拉提示
  17. vue中v-for和动态src问题及解决办法
  18. MongoDB的安装及安装为windows服务
  19. java 遍历指定目录下的文件夹并查找包含指定关键字的文件
  20. 让DELPHI自带的richedit控件显示图片

热门文章

  1. abp(net core)+easyui+efcore仓储系统——解决方案介绍(二)
  2. java 多线程 Callable中的futrue模式
  3. android 开发-文件存储之读写sdcard
  4. HDU 5452——Minimum Cut——————【树链剖分+差分前缀和】ACdream 1429——Diversion——————【树链剖分】
  5. ajax无刷新评论示例
  6. 从客户端(content1=&quot;&lt;img src=&quot;/web/news/...&quot;)中检测到有潜在危险的 Request.Form 值。
  7. OO 第四单元总结
  8. Java算法面试题 一个顺子带一对
  9. font:inherit
  10. elasticSearch 分布式安装