相比於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被耗盡。
2. 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佇列里。
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函式
在lin epoll_create(in epoll_ctl(in
-
epoll
epoll是Linux核心為處理大批量檔案描述符而作了改進的poll,是Linux下多路復用IO接口select/poll的增強版本,它能顯著提高程式在...
優點 核心微調 使用 系統調用 -
poll[函式]
poll是Linux中的字元設備驅動中的一個函式。Linux 2.5.44版本後,poll被epoll取代。和select實現的功能差不多,poll的作...
函式 poll實現功能 poll操作舉例 -
varnish
,然後處理下一個請求Epoll 執行緒: 一個請求處理稱作一個 session,在 session 周期內,處理完請求後,會交給Epoll 處理,監聽... epoll 執行緒。2.1.3 Epoll 執行緒,得到傳過來的 struct...
簡介 總體架構 工作流程 安裝配置 版本發布 -
Linux高性能伺服器編程
API、高級I/O函式、Linux伺服器程式規範、高性能伺服器程式框架、I...5.1.3 專用socket地址5.1.4 IP位址轉換函式5.2 創建...5.8.2 UDP數據讀寫5.8.3 通用數據讀寫函式5.9 帶外標記...
基本介紹 內容簡介 作者簡介 目錄 -
WinInet
資料2、EPOLL的資料3、 HTTP SERVER 的資料4、深入...關係⊙ HTTP 函式層次關係⊙ 典型的 HTTP 客戶端程式的處理流程1、普通 WinInet 處理函式⊙ InternetOpen 初始化...
WinInet WinInet 層關係 Internet 的連線 -
進程間通信
,write,open等普通IO函式. 管道描述符來類似於檔案描述符...select,epoll等.FAQ4: WINDOS進程間通信與LINUX進程間...
概述 主要分類 IPC目的 信號 管道 -
佇列機制
mechanism),還有異步函式調用 (asynchronous...(domain socket)寫一個字元,然後讀進程通過epoll得到數據到達的通知...字元,然後讀進程通過epoll得到數據到達的通知。 4. pipe 跟2...
定義 分類 -
Linux環境C語言編程
第4講Makefile介紹 第5講標準I/O的一些函式基本用法...19講多路轉接之select 第20講poll 第21講epoll的含義 第22講epoll的使用 第23講其他I/O系統調用...
基本信息 課程描述 作者介紹 課程目錄