libevent解析1--运行架构

libevent解析1--运行架构

        借着十一假期的休息,学习了libevent的源代码。libevent的相关内容在网上已经是多如牛毛,所以在这里就不做介绍了,本系列文章主要是按照自己的学习思路对libevent的运行方式做一个梳理。

         首先,libevent是一个事件处理库,使用了Reactor模式的事件处理机制。事件作为libevent库的最基本单元在程序中经历了以下三步:

  1. 事件初始化;
  2. 事件注册到libevent中;
  3. 事件发生,libevent调用注册事件的回调函数;
  4. 所有事件执行完成,程序结束;

        根据上面步骤,我们可以写出一个最简单的libevent程序:      

/**
 *源码来源:http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html
 */

//回调函数
static void timeout_cb(int fd, short event, void *arg) 
{
    struct timeval tv;
    struct event *timeout = arg;
    int newtime = time(NULL);

    printf("%s: called at %d: %d\n", "timeout_cb", newtime, newtime - lasttime);
    lasttime = newtime;

    evutil_timerclear(&tv);
    tv.tv_sec = 2;
     //重新注册event
    event_add(timeout, &tv);
}

int main(int argc, char **argv) {
    struct event timeout;
    struct timeval tv;

    /* Initalize the event library */
    //初始化event环境
    event_init();

    /* Initalize one event */
    //设置事件
    evtimer_set(&timeout, timeout_cb, &timeout);

    evutil_timerclear(&tv);
    tv.tv_sec = 2;
    
    //注册事件
    event_add(&timeout, &tv);

    lasttime = time(NULL);

    //等待,分发,处理事件
    event_dispatch();

    return (0);
}

          (源码的运行首先要安装了libevent库)

          运行结果:

           https://i-blog.csdnimg.cn/blog_migrate/9ad46f796da136179eb5d88797814e01.jpeg

        (源码来源:http://www.cnblogs.com/hustcat/archive/2010/08/31/1814022.html)

        从上面的程序可以看出,完成一个调用libevent的程序只要四个步骤:

  1. 初始化libevent库:event_init()(其他相似API:event_base_set(), event_base_new());
  2. 建立一个事件:evtimer_set(&timeout, timeout_cb, &timeout)(其实是调用libevent的事件建立函数:void event_set(struct event *, evutil_socket_t, short, void (*)(evutil_socket_t, short, void *), void *);)
  3. 把事件注册到libevent库中:event_add(&timeout, &tv);
  4. libevent库进入循环,等待事件的发生和调用回调函数:event_dispatch();

      

         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shuttlecock

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值