epoll - i/o event notification facility
在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。
相比於select,epoll最大的好處在於它不會隨著監聽fd數目的增長而降低效率。因為在核心中的select實現中,它是採用輪詢來處理的,輪詢的fd數目越多,自然耗時越多。並且,在linux/posix_types.h標頭檔案有這樣的宣告:
#define __fd_setsize 1024
表示select最多同時監聽1024個fd,當然,可以通過修改標頭檔案再重編譯核心來擴大這個數目,但這似乎並不治本。
epoll的介面非常簡單,一共就三個函式:
1. int epoll_create(int size);
建立乙個epoll的控制代碼,size用來告訴核心這個監聽的數目一共有多大。這個引數不同於select()中的第乙個引數,給出最大監聽的fd+1的值。需要注意的是,當建立好epoll控制代碼後,它就是會占用乙個fd值,在linux下如果檢視/proc/程序id/fd/,是能夠看到這個fd的,所以在使用完epoll後,必須呼叫close()關閉,否則可能導致fd被耗盡。(fd是整數順序增加)
events可以是以下幾個巨集的集合:
epollin :表示對應的檔案描述符可以讀(包括對端socket正常關閉);
epollout:表示對應的檔案描述符可以寫;
epollpri:表示對應的檔案描述符有緊急的資料可讀(這裡應該表示有帶外資料到來);
epollerr:表示對應的檔案描述符發生錯誤;
epollhup:表示對應的檔案描述符被結束通話;
epollet: 將epoll設為邊緣觸發(edge triggered)模式,這是相對於水平觸發(level triggered)來說的。
epolloneshot:只監聽一次事件,當監聽完這次事件之後,如果還需要繼續監聽這個socket的話,需要再次把這個socket加入到epoll佇列裡
3. 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表示已超時。
例子
epoll監聽檔案 Epoll的簡介及原理
epoll 全稱 eventpoll,是 linux 核心實現io多路復用 io multiplexing 的乙個實現。io多路復用的意思是在乙個操作裡同時監聽多個輸入輸出源,在其中乙個或多個輸入輸出源可用的時候返回,然後對其的進行讀寫操作。在 linux 中,和 epoll 類似的有 select...
epoll監聽檔案 Go 檔案監控怎麼實現
檔案監控linux下inotify特性 inotify是核心乙個特性,可以用來監控目錄,檔案的讀寫等事件.當監控目標是目錄時,inotify除了會監控目錄本身,還會監控目錄中的檔案.inotify 的監控功能由如下幾個系統呼叫組成 inotify init1,inotify add watch,in...
epoll之二 epoll實戰
int epoll create int size epoll create返回 乙個控制代碼,之後epoll的 使用都將依靠這個 控制代碼 來 標識,引數 size是告訴epoll所要處理的大致事件數目,不再使用epoll時,必須呼叫close 關閉這個控制代碼。size這個引數只是 告訴核心這個...