1、核心事件表
epoll是linux特有的i/o復用函式。epoll把使用者關心的檔案描述上的事件放在核心裡的乙個事件表中,並用乙個額外的檔案描述符來標識該核心事件表。這個額外檔案描述符使用函式epoll_create函式來建立。
#includeint epoll_create(int size)
size引數給核心提示事件表需要多大。該函式返回的檔案描述符用作其他epoll函式的第乙個引數,標識要訪問的核心事件表。
2、epoll_ctl函式
此函式用來操作核心事件表,操作型別有三種:
#includeint epoll_ctl(int epfd, int op, int fd, struct epoll_event* event) //成功返回0,失敗返回-1並置errno
fd引數是要操作的檔案描述符,op引數指定操作型別,event引數指定事件,epoll_event定義如下:
struct epoll_event
;
其中events成員描述事件型別,data成員用於儲存使用者資料,epoll_data_t定義如下:
typedef union epoll_data
epoll_data_t;
此為乙個共用體,使用最多的是fd,它標識事件所從屬的目標檔案描述符。ptr成員可用來指定與fd相關的使用者資料。
3、epoll_wait函式
此函式為epoll系列主要系統呼叫函式,它在一段超時時間內等待一組檔案描述符上的事件。
#includeint epoll_wait(int epfd, stuct epoll_event* events, int maxevents,int timeout)
此函式成功返回時返回就緒檔案描述符的個數,失敗返回-1並置errno。
timeout引數指定超時時間,maxevents引數指定最多監聽多少個事件,必須大於0。epfd指定核心事件表,函式成功返回時,events引數指向乙個陣列,陣列用於輸出就緒事件,陣列的大小就是函式返回的就緒檔案描述符個數。
//索引epoll返回的就緒檔案描述符
int ret = epll_wait(epllfd, events, max_event_number, -1);
for(int i = 0; i < ret; i++)
4、lt和et模式
epoll對檔案描述符的操作有兩種模式:lt模式和et模式。lt為預設模式,當往epoll核心事件表中註冊乙個檔案描述符上的epollet事件時,epoll將按照et模式來操作該檔案描述符。
lt模式和et模式區別:對於lt模式,epoll_wait檢測到其上有事件發生並將此事件通知應用程式後,應用程式可以不立即處理該事件,當應用程式下次呼叫epoll_wait時,該就緒事件還會被通告到應用程式,直到事件被處理。而對於et工作模式,當epoll_wait檢測到事件發生時通知應用程式,應用程式必須立即處理,因為後面epoll_wait不會再通告此事件發生。這樣et模式比lt模式減少了同乙個epoll事件被重複觸發的次數,效率較高。
I O多路復用之 epoll 系統呼叫
i o多路復用除了之前我們提到的select和poll外,epoll 也可以檢查多個檔案描述符的就緒狀態,以達到i o多路復用的目的。epoll 系統呼叫是 linux 系統專有的,在 linux 核心 2.6 版本新增,epoll 的主要優點有 其中,ready list 是 interest l...
epoll系列系統呼叫
需要包含的標頭檔案 include 1.int epoll create int size 在核心新建乙個事件表 這是與select和poll不同的地方 返回這個事件表的檔案描述符,這個檔案描述符將會作為epoll系統呼叫的第乙個引數。另外size引數並不起 作用,只是給核心乙個提示,它的事件表需要...
epoll 實現I O復用
epoll是linux特有的i o復用函式,它能顯著提高程式在大量併發連線中只有少量活躍的情況下的系統cpu利用率 並且epoll使用一組函式來完成任務,而不是單個函式,它無須遍歷整個被偵聽的描述符集,只要遍歷那些核心i o時間非同步喚醒而加入ready佇列的描述符集合即可。但epoll需要使用乙個...