轉自:https://blog.csdn.net/lookintosky/article/details/61658067git
libevent的入門學習-庫的安裝
最近開始接觸Linux應用層的東西,發現使用了libevent庫,就隨便學習了一下,這裏權做記錄github
這裏是一些不錯的文章,感謝做者的無私奉獻
libevent學習筆記 1、基礎知識
libevent學習筆記(參考libevent深度剖析)
libevent學習筆記【使用篇】——(零)異步IO簡介【系列譯文】
Libevent 官方文檔學習筆記(1. libevent_core部分)網絡
做爲學習的第一步,這裏介紹如何安裝libevnet函數庫異步
1、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等等。—[百度百科]memcached
2、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找到安裝的庫了ui
3、libevent的簡單使用
這裏直接使用了libevent學習筆記 1、基礎知識的代碼spa
#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);