libevent的安装和简单使用

1.安装libevent

mac下下载源码安装,执行到make时报错,fatal error because of ‘openssl/bio.h’ file not found

openssl实际已经安装,并且版本是最新。

解决方法是:

./configure LDFLAGS=’-L/usr/local/opt/openssl/lib’ CPPFLAGS=’-I/usr/local/opt/openssl/include’

安装成功,安装的libevent在/usr/local/lib/目录下。

2.简单例子使用

在libevent-2.1.8-stable/sample/目录下有很多例子。

libevent支持3种事件:读写事件、signal事件、定时事件。

这里以定时事件为例子,定时器打印hello world。编译时链接libevent库,gcc timer.c -o timer -levent

    #include <stdio.h>
    #include <event.h>
    
    void func(int sockfd, short event, void *arg) {
        printf("hello world\n");
        
        /* 事件执行完默认删除,所以重新添加 */
        struct timeval tv;
        tv.tv_sec = 1;
        tv.tv_usec = 0;
        /* int event_add(struct event *ev, const struct timeval *tv) */
        event_add((struct event*)arg, &tv);
    }
    
    int main() {
        event_init();
        struct event ev_time;
        evtimer_set(&ev_time, func, &ev_time);
        struct timeval tv;
        tv.tv_sec = 1;
        tv.tv_usec = 0;
    
        event_add(&ev_time, &tv);
    
        event_dispatch();
        return 0;
    }

解释:

 	/* Global state; deprecated */
    /* 这么写宏定义有什么好处? */
    struct event_base *event_global_current_base_ = NULL;
    #define current_base event_global_current_base_
    
    /* 创建event_base对象,event_base代表什么? */
    struct event_base *event_init(void)
    {
        struct event_base *base = event_base_new_with_config(NULL);
    
        if (base == NULL) {
            event_errx(1, "%s: Unable to construct event_base", __func__);
            return NULL;
        }
    	/* 指针 */
        current_base = base;
    
        return (base);
    }

个人理解:event_base代表一个事件集合,并轮训该集合中是否有事件准备好。

慢慢理解:event_base是libevent的事务处理框架,负责事件注册、删除等,属于Reactor模式中的Reactor。

为了方便对超时的处理:libevent定义了一些接口函数,在event.h头文件中

 	/**
       @name evtimer_* macros
    
        Aliases for working with one-shot timer events */
    /**@{*/
    #define evtimer_assign(ev, b, cb, arg) \
        event_assign((ev), (b), -1, 0, (cb), (arg))
    #define evtimer_new(b, cb, arg)        event_new((b), -1, 0, (cb), (arg))
    #define evtimer_add(ev, tv)     event_add((ev), (tv))
    #define evtimer_del(ev)         event_del(ev)
    #define evtimer_pending(ev, tv)     event_pending((ev), EV_TIMEOUT, (tv))
    #define evtimer_initialized(ev)     event_initialized(ev)
    /**@}*/

evtimer_set在event_compat.h头文件中,也是宏定义。

Reference:
[1] https://www.cnblogs.com/zxiner/p/6919036.html
[2] https://blog.csdn.net/u010710458/article/details/79437572

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章