epoll函式

epoll函式

在linux的網路編程中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。

基本介紹

  • 中文名:epoll函式
  • 接口函式1:int epoll_create
  • 接口函式2:int epoll_ctl
  • 接口函式3:int epoll_wait
函式簡介,接口函式,int epoll_create,int epoll_ctl,int epoll_wait,

函式簡介

相比於select,epoll最大的好處在於它不會隨著監聽fd數目的增長而降低效率。因為在核心中的select實現中,它是採用輪詢來處理的,輪詢的fd數目越多,自然耗時越多。並且,在linux/posix_types.h頭檔案有這樣的聲明:
#define __FD_SETSIZE 1024
表示select最多同時監聽1024個fd,當然,可以通過修改頭檔案再重編譯核心來擴大這個數目,但這似乎並不治本。

接口函式

epoll的接口非常簡單,一共就三個函式:

int epoll_create

int epoll_create(int size)
創建一個epoll的句柄,size用來告訴核心這個監聽的數目一共有多大。這個參數不同於select()中的第一個參數,給出最大監聽的fd+1的值。需要注意的是,當創建好epoll句柄後,它就是會占用一個fd值,在linux下如果查看/proc/進程id/fd/,是能夠看到這個fd的,所以在使用完epoll後,必須調用close()關閉,否則可能導致fd被耗盡。
自從Linux 2.6.8開始,size參數被忽略,但是依然要大於0。

int epoll_ctl

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
epoll的事件註冊函式,它不同與select()是在監聽事件時告訴核心要監聽什麼類型的事件,而是在這裡先註冊要監聽的事件類型。第一個參數是epoll_create()的返回值,第二個參數表示動作,用三個宏來表示:
EPOLL_CTL_ADD:註冊新的fd到epfd中;
EPOLL_CTL_MOD:修改已經註冊的fd的監聽事件;
EPOLL_CTL_DEL:從epfd中刪除一個fd;
第三個參數是需要監聽的fd,第四個參數是告訴核心需要監聽什麼事,struct epoll_event結構如下:
struct epoll_event {
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
events可以是以下幾個宏的集合:
EPOLLIN :表示對應的檔案描述符可以讀(包括對端SOCKET正常關閉);
EPOLLOUT:表示對應的檔案描述符可以寫;
EPOLLPRI:表示對應的檔案描述符有緊急的數據可讀(這裡應該表示有帶外數據到來);
EPOLLERR:表示對應的檔案描述符發生錯誤;
EPOLLHUP:表示對應的檔案描述符被掛斷;
EPOLLET: 將EPOLL設為邊緣觸發(Edge Triggered)模式,這是相對於水平觸發(Level Triggered)來說的。
EPOLLONESHOT:只監聽一次事件,當監聽完這次事件之後,如果還需要繼續監聽這個socket的話,需要再次把這個socket加入到EPOLL佇列里。

int epoll_wait

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
等待事件的產生,類似於select()調用。參數events用來從核心得到事件的集合,maxevents表示每次能處理的最大事件數,告之核心這個events有多大,這個maxevents的值不能大於創建epoll_create()時的size,參數timeout是逾時時間(毫秒,0會立即返回,-1將不確定,也有說法說是永久阻塞)。該函式返回需要處理的事件數目,如返回0表示已逾時。

相關詞條

熱門詞條

聯絡我們