Libevent源码分析
文章平均质量分 83
yuanhaitaozz
啊啊啊啊啊啊啊啊
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
libevent框架使用实例
首先,先贴一个简单的使用libevent实现的定时器: #include #include void onTime(int sock, short event, void *arg) { printf("Time Bomb!\n"); struct timeval tv; tv.tv_sec = 2; tv.tv_usec = 0; event_add((struct even原创 2015-05-27 19:05:20 · 661 阅读 · 0 评论 -
libevent源码分析之深入信号处理
信号 关于统一事件源, 本文是在对其有所了解的情况下进行的,旨在加深对libevent的整体理解 首先,想要了解信号事件的处理,我们需要知道关于信号这部分的接口、内容分别在哪里 纵观整个文件夹, 可以看到evsignal-internal.h, signal.c, signal-test.c 这几个文档, 接口在哪里呢? 回忆之前所学内容, 首先肯定是找event_base , 在添加原创 2015-06-23 16:41:18 · 647 阅读 · 0 评论 -
libevent源码分析之事件激活
之前了解过了多种事件, 但都是从是什么, 如何理解, 如何存储的方面讲解的, 这里就集中的谈谈事件的激活 了解的事件有, 基本IO事件, 信号事件, 超时事件(只是事件可以是单纯的超时事件, 也可以是其他事件带有定时器, 因此不会特意看超时事件) 以及不同优先级事件的处理 虽然IO事件与信号事件是截然不同的处理方式, 但他们的事件处理程序都是处测在同一个event_base中的, 所以想原创 2015-07-04 16:55:49 · 857 阅读 · 1 评论 -
libevent源码之TAILQ详解
首先,让我们看看插入操作的源代码: #define TAILQ_INSERT_TAIL(head, elm, field) do { \ (elm)->field.tqe_next = NULL; \ (elm)->field.tqe_prev = (head)->tqh_last; \原创 2015-06-14 17:43:51 · 2571 阅读 · 3 评论 -
Libevent源码分析之event结构体初识
I/O框架库以库函数的形式,封装了较为底层的系统调用,给应用程序提供了一组更为便捷的接口 各种I/O框架库的实现原理基本相似,要么以Reactor模式实现,要么以Proactor模式实现,要么同时用这两种模式。 拿基于Reactor模式的I/O框架库来说,包含以下几个组件: 1、句柄 I/O框架库要处理的对象,即I/O事件、信号和定时事件,统一称为事件源。一个事件源通常和一个句柄绑原创 2015-05-25 15:55:02 · 626 阅读 · 0 评论 -
libevent源码分析之关于notify
之前学习过程中遇到过要notify主线程的情况, 不过并未理会选择直接跳过, 现在拿来细讲. 其实简单的说, notify就是告知主线程你的内部发生了变化,现在最好停止等待, 重新调用IO复用函数 比如在event_add ---> event_add_internal中 static inline int event_add_internal(struct event *ev, c原创 2015-06-29 21:02:41 · 792 阅读 · 0 评论 -
libevent源码分析之多线程准备工作
libevent中是默认不开启多线程的,也就没有什么锁, 条件变量等的说法了 我们可以使用evthread_use_pthreads()开启linux下的pthread #ifdef WIN32 int evthread_use_windows_threads(void); #define EVTHREAD_USE_WINDOWS_THREADS_IMPLEMENTED #endif #i原创 2015-06-25 15:32:50 · 1108 阅读 · 0 评论 -
libevent使用(一)-----基础配置
Libevent中的日志消息 Ibevent会记录内部发生的错误和警告,当然,我们也可以自己实现日志函数覆盖框架原本提供的 typedefvoid (*event_log_cb)(intseverity, constchar *msg); void event_set_log_callback(event_log_cb cb); 可见,我们可以通过给event_set_log_callb原创 2015-05-28 16:37:33 · 653 阅读 · 0 评论 -
libevent源代码分析之优先级
在学习基础API的时候,遇到过两个函数: int event_base_priority_init(struct event_base *base, int n_priorities); 以及 int event_priority_set(struct event *event, int priority); 阅读相关文档后得知, 第一个函数用于设置整个event_base的最大优原创 2015-06-24 09:16:57 · 673 阅读 · 0 评论 -
libevent使用(二) ----- event_base 和 event
如果设置event_base使用锁,则可以安全的在多线程这使用它。 然而,其事件循环则只能运行在一个线程中,如果需要用多个线程检测IO,则需要为每个线程使用一个event_base。 建立默认的event_base struct event_base *event_base_new(void) //函数分配并返回一个新的具有默认设置的event_base。函数会检测环境变量原创 2015-06-01 17:33:50 · 1124 阅读 · 0 评论 -
libevent源码分析之关于IO复用的选取
关于libevent使用的后台IO复用技术, 无非就是那几种, 这里我们将会看到的是libevent是如何选取某平台上最合适的IO复用的, 以及对IO复用的包装的例子 想要了解后台IO复用的选取, 首先需要知道的是在哪里声明了IO复用的接口, 既然IO复用是要贯穿整个网络库的, 那么说明我们需要从event_base里找:struct event_base { /** Func原创 2015-06-21 10:54:48 · 819 阅读 · 0 评论 -
关于select函数使用的fd_set
最近遇到了fd_set, 虽然早早的听说是将描述符按位存储, 但不清楚其实现, 今天就来仔细的看看其实现 /* The fd_set member is required to be an array of longs. */ //从注释可以看出的是, fd_set本质是一串long int类型的数组 typedef long int __fd_mask; /* Some vers原创 2015-06-21 10:16:12 · 988 阅读 · 0 评论 -
libevent源码分析之event_io_map与event_signal_map
现在,我们来看看libevent中使用的哈希表 在学习此数据结构之前,要知道一个事实,什么时候会使用到这个哈希表: /* On some platforms, fds start at 0 and increment by 1 as they are allocated, and old numbers get used. For these platforms, we原创 2015-06-16 18:25:28 · 1374 阅读 · 0 评论 -
libevent源码分析之带有定时器的事件
关于超时event, 一开始接触libevent时遇到的example就是它, 小巧而简单易懂, 但是其内部却因为种种因素而十分庞杂. 一个单纯的定时器event如下定义: #define evtimer_new(b, cb, arg) event_new((b), -1, 0, (cb), (arg)) 其实, 如果需要一个event拥有定时器的功能, 都只需要在event_原创 2015-06-29 16:49:10 · 3492 阅读 · 0 评论
分享