IO復用 epoll系列系統呼叫

2021-08-19 18:08:29 字數 1578 閱讀 3617

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需要使用乙個...