1. 程式人生 > >libevent的入門學習-庫的安裝【轉】

libevent的入門學習-庫的安裝【轉】

轉自:https://blog.csdn.net/lookintosky/article/details/61658067

libevent的入門學習-庫的安裝
最近開始接觸Linux應用層的東西,發現使用了libevent庫,就隨便學習了一下,這裡權作記錄

這裡是一些不錯的文章,感謝作者的無私奉獻
libevent學習筆記 一、基礎知識
libevent學習筆記(參考libevent深度剖析)
libevent學習筆記【使用篇】——(零)非同步IO簡介【系列譯文】
Libevent 官方文件學習筆記(1. libevent_core部分)

作為學習的第一步,這裡介紹如何安裝libevnet函式庫

一、libevent簡介
Libevent 是一個用C語言編寫的、輕量級的開源高效能網路庫,主要有以下幾個亮點:事件驅動( event-driven),高效能;輕量級,專注於網路,不如 ACE 那麼臃腫龐大;原始碼相當精煉、易讀;跨平臺,支援 Windows、 Linux、 *BSD 和 Mac Os;支援多種 I/O 多路複用技術, epoll、 poll、 dev/poll、 select 和 kqueue 等;支援 I/O,定時器和訊號等事件;註冊事件優先順序。
Libevent 已經被廣泛的應用,作為底層的網路庫;比如 memcached、 Vomit、 Nylon、 Netchat等等。—[百度百科]

二、libevent的安裝
libevent的庫可以從官網下載,這裡介紹一種偷懶的方法,一般開源庫會在github有託管,這裡我使用的連結地址為
https://github.com/libevent/libevent

git clone https://github.com/libevent/libevent.git
sudo apt-get install cmake
mkdir build && cd build
cmake ..

此時執行會報錯,資訊如下:

-- Looking for CTL_KERN - found
-- Looking for KERN_ARND - not found
-- Looking for KERN_RANDOM - found
-- Looking for RANDOM_UUID - found
CMake Error at /usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:148 (message):
Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
system variable OPENSSL_ROOT_DIR (missing: OPENSSL_LIBRARIES
OPENSSL_INCLUDE_DIR)
Call Stack (most recent call first):
/usr/share/cmake-3.5/Modules/FindPackageHandleStandardArgs.cmake:388 (_FPHSA_FAILURE_MESSAGE)
/usr/share/cmake-3.5/Modules/FindOpenSSL.cmake:370 (find_package_handle_standard_args)
CMakeLists.txt:693 (find_package)
-- Configuring incomplete, errors occurred!
See also "***/libevent/build/CMakeFiles/CMakeOutput.log".
See also "***/libevent/libevent/build/CMakeFiles/CMakeError.log".

說明缺少一些庫的東西,直接安裝好了,執行

sudo apt install libssl-dev
cmake ..
make
make verify[optional]
sudo make install

然後就可以在/usr/local/lib和/usr/local/include找到安裝的庫了

三、libevent的簡單使用
這裡直接使用了libevent學習筆記 一、基礎知識的程式碼

#include <stdlib.h>
#include <stdio.h>
#include <sys/time.h>
#include <event.h>
// 定時事件回撥函式
void onTime(int sock, short event, void *arg)
{
printf("Hello,World!\n");

struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
// 重新新增定時事件(定時事件觸發後預設自動刪除)
event_add((struct event*)arg, &tv);
}

int main()
{
// 初始化
event_init();

struct event ev_time;
// 設定定時事件
evtimer_set(&ev_time, onTime, &ev_time);

struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
// 新增定時事件
event_add(&ev_time, &tv);

// 事件迴圈
event_dispatch();

return 0;
}

這裡簡要簡紹一下好了
1)首先初始化 libevent 庫,並儲存返回的指標
struct event_base * base = event_init();
實際上這一步相當於初始化一個 Reactor 例項;在初始化 libevent 後,就可以註冊事件了。
2)設定event屬性和回撥函式
呼叫函式void event_set(struct event *ev, int fd, short event, void (*cb)(int,
short, void *), void *arg);
每個引數的意義:

ev:執行要初始化的 event 物件;
fd:該 event 繫結的“控制代碼”,對於訊號事件,它就是關注的訊號;
event:在該 fd 上關注的事件型別,它可以是 EV_READ, EV_WRITE,EV_SIGNAL;
cb:這是一個函式指標,當 fd 上的事件 event 發生時,呼叫該函式執行處理,它有三個引數,分別是關注的fd, 關注的事件型別(讀/寫/訊號),回撥函式的引數void* arg,呼叫時由event_base 負責傳入,按順序,實際上就是 event_set 時的 fd, event 和 arg;
arg:傳遞給 cb 函式指標的引數;
注意: libevent 並不會管理 event 事件集合,這需要應用程式自行管理;
3)evtimer_set

#define evtimer_set(ev, cb, arg) event_set((ev), -1, 0, (cb), (arg))
1
定時事件不需要 fd,並且定時事件是根據新增時( event_add)的超時值設定的,因此event也 不需要設定。
4)設定 event 從屬的 event_base
event_base_set(base, &ev);
這一步相當於指明 event 要註冊到哪個 event_base 例項上;
5)將事件新增到事件佇列裡
event_add(&ev, timeout);

對上述檔案進行編譯,執行,基本就可以看到間隔一秒輸出”hello world”了。
---------------------
作者:lookintosky
來源:CSDN
原文:https://blog.csdn.net/lookintosky/article/details/61658067
版權宣告:本文為博主原創文章,轉載請附上博文連結!