libevent學習筆記之一 Libevent簡介

2021-10-05 16:11:21 字數 1651 閱讀 8430

libevent學習筆記之一: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主要特點

libevent 編譯庫**,編譯指令碼會判斷os支援哪種型別的事件機制(select、epoll或kqueue),然後根據條件編譯相應**,供上層使用的介面仍然是保持統一的(這就體現跨平台了特徵)。在linux各種版本上編譯相當方便和很容易,configure以後make,make install就可以了,windows上編譯有點繁瑣,需要稍微做些改動就可以了。

libevent支援使用者使用三種型別的事件,分別是網路io、定時器、訊號三種,最新版本在定時器的實現上使用了最小堆的資料結構,以達到高效查詢、排序、刪除定時器的目的,io和訊號的實現均使用了雙向佇列(用鍊錶實現)。網路io上,主要關注了一下linux上的epoll(因為目前的開發主要在linux平台),結果發現libevent的epoll居然用的epolllt,水平觸發的方式用起來比較方便,不容易出錯,但是在效率上可能比epollet要低一些。

libevent定時器的資料結構目前已經支援最小堆(min heap),以提高效率;網路io和訊號的資料結構採用了雙向佇列(tailq)。在實現上主要有3種鍊錶: evlist_inserted, evlist_active, evlist_timeout,乙個ev在這3種鍊錶之間被插入或刪除,處於evlist_active鍊錶中的ev最後將會被排程執行。

libevent提供了dns,http server,rpc等元件,http server可以說是libevent的經典應用。從http.c可看到libevent的很多標準寫法。寫非阻塞式的http server很容易將socket處理與http協議處理糾纏在一起,libevent在這點上似乎也有值得推敲的地方。

二、支援的程式設計環境

支援多執行緒:libevent支援多執行緒程式設計,每個事件需要關聯到自己的event_base。

支援的開發軟體:chromium、memcached、ntp、httpsqs等著名的開源程式都使用libevent庫。

三、libenvent主要構成

libevent包括事件管理、快取管理、dns、http、快取事件幾大部分。

事件管理:包括各種io(socket)、定時器、訊號等事件;

快取管理:是指evbuffer功能;

dns:是libevent提供的乙個非同步dns查詢功能;

http:是libevent的乙個輕量級http實現,包括伺服器和客戶端。

libevent也支援ssl,這對於有安全需求的網路程式非常的重要,但是不是很完善,比如http server的實現就不支援ssl。

libevent學習筆記 setvbuf 函式

函式名 setvbuf 用 法 int setvbuf file stream,char buf,int type,unsigned size type 期望緩衝區的型別 iofbf 滿緩衝 當緩衝區為空時,從流讀入資料。或者當緩衝區滿時,向流寫入數 據。iolbf 行緩衝 每次從流中讀入一行資料或...

Shell學習筆記之一

1.先看乙個常用的命令 這個命令組合了幾個不同的shell命令,shell命令是有這種特性在裡面的。就是統一性,簡單性。可以通過管道命令組合多個shell命令。如上面的命令,分別是 顯示當前執行的程序,sort是對程序進行排序,uniq是去除重複的情況,grep v sh 是去掉,不展示sh這個程序...

SQLite學習筆記之一

2010年sqlite學習筆記之一 官方站點 從 的download頁面獲取 download.html sqlite amalgamation 3 6 22.zip是sqlite的windows下原始碼檔案 sqlite 3 6 22.zip sqlitedll 3 6 22.zip 在sqlit...