Libevent
抖抖认真了
要成为合格的程序员
展开
-
Libevent---数据结构
1. 事件处理对象--event Libevent中事件处理对象是event结构类型。event结构体封装了句柄、事件类型、回调函数,以及其他必要的标志和数据。struct event { // 事件回调结构 struct event_callback ev_evcallback; /* for managing timeouts */ //如果是超时事件,则表明是小根堆还是通用超时队列 union { TAILQ_ENTRY(even..原创 2020-12-30 10:11:36 · 326 阅读 · 0 评论 -
Libevent--事件处理
以I/O事件为例 Libevent源码版本2.1.111. 注册事件 应用程序调用event_add函数将其添加到注册事件队列中,并将对应的事件注册到事件多路分发器上。intevmap_io_add_(struct event_base *base, evutil_socket_t fd, struct event *ev){ /* 获得event_base的后端I/O复用机制实例 */ const struct eventop *evsel = base-&g...原创 2020-12-30 10:05:58 · 630 阅读 · 0 评论 -
Libevent--信号事件
对于信号事件的监听,比较不同的是,不是每一个信号有一个event,然后放进内核中去监听。而是对于所有信号,共用一个信号事件event去监听,当有信号来临时,使用管道将信号写进去,libevent通过这个event来监听这个管道,然后当这个管道有数据读的时候,这个event的回调函数就是遍历管道中的信号,然后分别将该信号的事件处理器添加到激活队列中。 ...原创 2020-12-30 10:00:44 · 649 阅读 · 0 评论 -
Libevent--通知
我们可能考虑到主线程正在阻塞dispatch上,由于没有任何事件就绪,因此dispatch会阻塞到设置的超时时间才会返回;为了能让dispatch在需要返回的时候立刻返回,Libevent采用了和信号处理相同的方式:定义一个内部事件专门用来唤醒主线程,其实就是添加这个内部事件,然后唤醒的方式就是往内部事件监听的管道上写数据。1. event_base中的数据 与事件event一样,event_base中也会存在这样一个内部事件用来进行唤醒,以及一些其他的数据成员,如下所示:st...原创 2020-12-30 09:52:58 · 364 阅读 · 0 评论 -
Libevent--Timeout
超时事件,在libevent中或许收到了更多的关照,这里使用了两种数据来处理,第一个就是小根堆,第二个就是不同相对超时时间的队列common_timeout。1.为什么要使用两种不同的数据结构呢? 用于超时管理的min_heap,在执行主循环的过程中,它每次都会去检查min_heap的堆顶event是否超时,如果超时的话就进行相应的处理并且从min_heap中移除这个event,然后调整整个堆,直到堆顶event未超时则停止检查。这样每次删除堆顶超时的event时间复杂度只需要O...原创 2020-12-30 09:43:22 · 631 阅读 · 0 评论