Libevent 是一個輕量級的開源高性能網絡庫,有幾個顯著的亮點:網絡
Libevent 已經被普遍的應用,做爲底層的網絡庫;好比 memcached、Vomit、Nylon、Netchat等等。socket
下載安裝包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
頻繁報了openssl問題
若是真的不行,那麼可能openssl的目錄不在系統的默認路徑置中,那麼能夠加入一個軟鏈接
# ln -sf /usr/local/ssl/include/openssl /usr/include/openssl
若是仍是有問題,那麼多是你的openssl的版本過低,能夠試試升級
# yum update openssl -y
第一個例子:
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庫使用時的代碼邏輯:
建立具體的事件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模式
事件結束後,利用event_free()來釋放事件資源,利用event_base_free()來釋放event_free對象
若是事件表中都是一次性事件,一次事件觸發後會結束事件今後再也不監聽 evtimer_new()默認的超時事件是一個一次性的事件,若是須要屢次監聽,能夠從event_new中進行詳細的設置 event_new()中,信號事件直接在fd處寫入信號名稱,若是是超時事件,則用-1來代表