libevent入門和使用
libevent是什麼?
libevnet是一個事件驅動框架,提供一種處理機制,當fd有事件發生或超時時執行回撥函式;同時libevent支援posix訊號和普通超時回撥。libevent的目標就是要取代事件驅動server的事件迴圈。應用僅僅需要呼叫event_dispatch(),接著就可以在不改變事件迴圈的情況下增加刪除事件。libevent提供統一的event api來封裝底層事件機制,比如select,poll,epoll,kqueue等。libevent可以使用在多執行緒環境中,一種方法是一個執行緒只能訪問event_base,另一種方式是多個執行緒加鎖訪問一個event_base。libevent事件框架也是典型的Reactor模式,event封裝了fd和fd事件處理函式,event_base處理多個event,對應Reactor。libevnet還是一個緩衝網路io的高階框架,支援sockets, filters, rate-limiting, SSL, zero-copy file transmission, and IOCP。libevent還支援幾個有用的協議,包括dns,http,rpc框架。
之後的程式碼分析以libevent-1.4.14b-stable版本為準,底層多路複用機制分析epoll。
libevent原始碼分析,只專注於I/O讀寫事件和超時事件,對signal不做分析。
libevnet的事件框架和reids的事件框架類似。
libevent使用例子
1)首先初始化libevent庫,並儲存返回的指標
struct event_base * base = event_init();
實際上這一步相當於初始化一個Reactor例項;在初始化libevent後,就可以註冊事件了。
2)初始化事件event,設定回撥函式和關注的事件
event_set(&ev, -1, 0, timer_cb, NULL);
event_set的函式原型是: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發生時,呼叫該函式執行處理,它有三個引數,呼叫時由event_base負責傳入,按順序,實際 上就是event_set時的fd, event和arg;
arg:傳遞給cb函式指標的引數;
這一步相當於設定fd,對fd要關注的事件,事件的處理函式;
3)設定event從屬的event_base
event_base_set(base, &ev);
這一步相當於指明event要註冊到哪個event_base例項上;
4)新增事件,底層呼叫epoll_ctl
event_add(&ev, timeout); // timeout是定時值;
5)程式進入無限迴圈,等待就緒事件並執行事件處理,底層呼叫epoll_wait
event_base_dispatch(base);
參考:
官方網站:http://libevent.org/
書籍programming with libevent:http://www.wangafu.net/~nickm/libevent-book/
相關文章
- libevent入門
- libevent入門介紹
- libevent使用<一> libevent匯入專案
- redux和mobx入門使用Redux
- vuex 基本入門和使用(二)Vue
- kafka入門安裝和使用Kafka
- 使用 libevent 和 libev 提高網路應用效能
- pip安裝和使用入門指南
- RxJava 入門和常見使用方式RxJava
- YOLOv5快速入門和使用YOLO
- Sass 的入門安裝和基本使用
- Android入門教程 | RecyclerView使用入門AndroidView
- Sharding-JDBC 使用入門和基本配置JDBC
- Nginx入門級安裝和基礎使用Nginx
- vuex 基本入門和使用(三)-關於 mutationVue
- ccs的介紹,安裝和使用入門
- PromiseKit 入門使用Promise
- Mysql - 使用入門MySql
- Docker使用入門Docker
- IPFS 使用入門
- lucene入門使用
- Numpy使用入門
- Elasticsearch 入門使用Elasticsearch
- MAT使用入門
- Git使用入門Git
- SQLite使用入門SQLite
- CentOS使用入門CentOS
- Jetty使用入門Jetty
- plantuml使用入門
- PyAutoGUI使用入門GUI
- postman 使用入門Postman
- JNA使用入門
- valgrind使用入門
- Redis 入門使用Redis
- Libevent APIAPI
- iOS GCD入門和GCD對CPU多核的使用iOSGC
- Excel 中的 COUNTA 和 COUNTIF 函式使用入門Excel函式
- mongoose的入門使用Go