Linux下libevent庫的基礎安裝和安裝錯誤的解決方案以及使用

關於libevent庫

Libevent 是一個輕量級的開源高性能網絡庫,有幾個顯著的亮點:網絡

  • 事件驅動(event-driven),高性能;
  • 輕量級,專一於網絡,不如 ACE 那麼臃腫龐大;
  • 源代碼至關精煉、易讀;
  • 跨平臺,支持 Windows、 Linux、 *BSD 和 Mac Os;
  • 支持多種 I/O 多路複用技術, epoll、 poll、 dev/poll、 select 和 kqueue 等;
  • 支持 I/O,定時器和信號等事件;
  • 註冊事件優先級;

Libevent 已經被普遍的應用,做爲底層的網絡庫;好比 memcached、Vomit、Nylon、Netchat等等。socket

關於libevent的安裝

下載安裝包memcached

官網: http://www.monkey.org/~provos...
下載: http://www.monkey.org/~provos...

解壓函數

# tar zxvf libevent-2.0.10-stable.tar.gz

進入目錄性能

# cd libevent-2.0.10-stable

切換到root測試

# su

安裝gccspa

# yum install gcc

設置安裝路徑
不加這句的話,默認安裝目錄在/usr/local/libcode

# ./configure --prefix=/usr

編譯對象

# make

安裝事件

# make install

測試libevent是否安裝成功:

# ls -al /usr/lib | grep libevent

lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent-1.2.so.1 -> libevent-1.2.so.1.0.3
-rwxr-xr-x 1 root root 263546 11?? 12 17:38 libevent-1.2.so.1.0.3
-rw-r–r– 1 root root 454156 11?? 12 17:38 libevent.a
-rwxr-xr-x 1 root root 811 11?? 12 17:38 libevent.la
lrwxrwxrwx 1 root root 21 11?? 12 17:38 libevent.so -> libevent-1.2.so.1.0.3

安裝問題

  1. 頻繁報了openssl問題

    • 首先先排查你究竟裝了libevent沒有,我在給朋友從新配置環境時候,怎麼都會報錯,該試的都試了,最後結果在/usr/local/lib/下面看到了一堆的libevent.so,這個真的是,太無語了。
      言歸正傳,若是你不是設置過./configure的話,默認安裝目錄在/usr/local/lib下面,裝前你先看一看嘛,又不吃虧,不行的話能夠 find 一下嘛
    • 若是真的不行,那麼可能openssl的目錄不在系統的默認路徑置中,那麼能夠加入一個軟鏈接

      # ln -sf  /usr/local/ssl/include/openssl    /usr/include/openssl
    • 若是仍是有問題,那麼多是你的openssl的版本過低,能夠試試升級

      # yum update openssl -y

libevent的使用

第一個例子:

int main()
{
    int sockfd = create_socket();

    struct event_base * base = event_init();
    assert( base != NULL );

    struct event* ev_sock = event_new(base,sockfd,EV_READ|EV_PERSIST,accept_cb,(void*)base);
    assert( ev_sock != NULL );
    event_add(ev_sock,NULL);

    event_base_dispatch(base);
    event_free(ev_sock);
    event_base_free(base);
}

第二個例子:

int main()
{
    struct event_base *base = event_init();
    struct event *signal_event = evsignal_new(base,SIGINT,signal_cb,base);
    event_add(signal_event,NULL);

    struct timeval tv = {3,0};
    struct event *timeout_event = evtimer_new(base,timeout_cb,NULL);
    event_add(timeout_event,&tv);

    event_base_dispatch(base);

    event_free(timeout_event);
    event_free(signal_event);
    event_base_free(base);
}

這兩個簡單例子反映了event庫使用時的代碼邏輯:

  1. 首先用event_init()來構建一個event_base對象
  2. 建立具體的事件event *用來表示具體事件,用evsignal_new,或者evtimer_new來註冊事件,兩個函數本質上來講都是對函數event_new()的封裝

    struct event* event_new(struct event_base *base, evutil_socket_t fd,
                            short event, void (*cb)(evutil_socket_t fd, 
                            short event, void *arg),void *arg);
    
    //short event所使用的宏名
    #define EV_TIMEOUT 0x01 //定時時間
    #define EV_READ    0x01 //可讀時間
    #define EV_WRITE   0x01 //可寫時間
    #define EV_SIGNAL  0x01 //信號時間
    #define EV_PERSIST 0x01 //永久時間
    #define EV_ET      0x20 //邊緣觸發,epoll下的ET模式
  3. 調用event_add()函數,將事件註冊到事件表中去
  4. 調用event_base_dispatch()執行事件循環
  5. 事件結束後,利用event_free()來釋放事件資源,利用event_base_free()來釋放event_free對象

    若是事件表中都是一次性事件,一次事件觸發後會結束事件今後再也不監聽 evtimer_new()默認的超時事件是一個一次性的事件,若是須要屢次監聽,能夠從event_new中進行詳細的設置 event_new()中,信號事件直接在fd處寫入信號名稱,若是是超時事件,則用-1來代表
相關文章
相關標籤/搜索