
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 · 633 阅读 · 0 评论 -
libevent源码分析之深入信号处理
信号关于统一事件源, 本文是在对其有所了解的情况下进行的,旨在加深对libevent的整体理解首先,想要了解信号事件的处理,我们需要知道关于信号这部分的接口、内容分别在哪里纵观整个文件夹, 可以看到evsignal-internal.h, signal.c, signal-test.c 这几个文档, 接口在哪里呢?回忆之前所学内容, 首先肯定是找event_base , 在添加原创 2015-06-23 16:41:18 · 618 阅读 · 0 评论 -
libevent源码分析之事件激活
之前了解过了多种事件, 但都是从是什么, 如何理解, 如何存储的方面讲解的, 这里就集中的谈谈事件的激活了解的事件有, 基本IO事件, 信号事件, 超时事件(只是事件可以是单纯的超时事件, 也可以是其他事件带有定时器, 因此不会特意看超时事件)以及不同优先级事件的处理虽然IO事件与信号事件是截然不同的处理方式, 但他们的事件处理程序都是处测在同一个event_base中的, 所以想原创 2015-07-04 16:55:49 · 812 阅读 · 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 · 2509 阅读 · 3 评论 -
Libevent源码分析之event结构体初识
I/O框架库以库函数的形式,封装了较为底层的系统调用,给应用程序提供了一组更为便捷的接口各种I/O框架库的实现原理基本相似,要么以Reactor模式实现,要么以Proactor模式实现,要么同时用这两种模式。拿基于Reactor模式的I/O框架库来说,包含以下几个组件:1、句柄 I/O框架库要处理的对象,即I/O事件、信号和定时事件,统一称为事件源。一个事件源通常和一个句柄绑原创 2015-05-25 15:55:02 · 591 阅读 · 0 评论 -
libevent源码分析之关于notify
之前学习过程中遇到过要notify主线程的情况, 不过并未理会选择直接跳过, 现在拿来细讲.其实简单的说, notify就是告知主线程你的内部发生了变化,现在最好停止等待, 重新调用IO复用函数比如在event_add ---> event_add_internal中static inline intevent_add_internal(struct event *ev, c原创 2015-06-29 21:02:41 · 750 阅读 · 0 评论 -
libevent源码分析之多线程准备工作
libevent中是默认不开启多线程的,也就没有什么锁, 条件变量等的说法了我们可以使用evthread_use_pthreads()开启linux下的pthread#ifdef WIN32int evthread_use_windows_threads(void);#define EVTHREAD_USE_WINDOWS_THREADS_IMPLEMENTED#endif#i原创 2015-06-25 15:32:50 · 1068 阅读 · 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 · 600 阅读 · 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 · 628 阅读 · 0 评论 -
libevent使用(二) ----- event_base 和 event
如果设置event_base使用锁,则可以安全的在多线程这使用它。然而,其事件循环则只能运行在一个线程中,如果需要用多个线程检测IO,则需要为每个线程使用一个event_base。建立默认的event_basestruct event_base *event_base_new(void)//函数分配并返回一个新的具有默认设置的event_base。函数会检测环境变量原创 2015-06-01 17:33:50 · 1026 阅读 · 0 评论 -
libevent源码分析之关于IO复用的选取
关于libevent使用的后台IO复用技术, 无非就是那几种,这里我们将会看到的是libevent是如何选取某平台上最合适的IO复用的, 以及对IO复用的包装的例子想要了解后台IO复用的选取, 首先需要知道的是在哪里声明了IO复用的接口, 既然IO复用是要贯穿整个网络库的, 那么说明我们需要从event_base里找:struct event_base { /** Func原创 2015-06-21 10:54:48 · 789 阅读 · 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 · 954 阅读 · 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 · 1329 阅读 · 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 · 3440 阅读 · 0 评论