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

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