轉載自 這裏
事件處理流程
當應用程序向libevent註冊一個事件後,libevent內部是怎麼樣進行處理的呢?下面的圖就給出了這一基本流程。
1) 首先應用程序準備並初始化event,設置好事件類型和回調函數;這對應於前面第步驟2和3;
2) 向libevent添加該事件event。對於定時事件,libevent使用一個小根堆管理,key爲超時時間;對於Signal和I/O事件,libevent將其放入到等待鏈表(wait list)中,這是一個雙向鏈表結構;
3) 程序調用event_base_dispatch()系列函數進入無限循環,等待事件,以select()函數爲例;每次循環前libevent會檢查定時事件的最小超時時間tv,根據tv設置select()的最大等待時間,以便於後面及時處理超時事件;
當select()返回後,首先檢查超時事件,然後檢查I/O事件;
Libevent將所有的就緒事件,放入到激活鏈表中;
然後對激活鏈表中的事件,調用事件的回調函數執行事件處理;