epoll 實現I O復用

2021-07-16 16:21:54 字數 2470 閱讀 5630

epoll是linux特有的i/o復用函式,它能顯著提高程式在大量併發連線中只有少量活躍的情況下的系統cpu利用率;並且epoll使用一組函式來完成任務,而不是單個函式,它無須遍歷整個被偵聽的描述符集,只要遍歷那些核心i/o時間非同步喚醒而加入ready佇列的描述符集合即可。但epoll需要使用乙個額外的檔案描述符,來唯一標識核心中的這個事件表。

1、這個檔案描述符使用epoll_create函式來建立:

size引數現在並不起作用,只是給核心乙個提示,告訴它事件表需要多大。該函式返回的檔案描述符將用作其他所有epoll系統呼叫的第乙個引數,以指定要訪問的核心事件表。

2、使用epoll_create函式來操作核心事件表

epoll的事件註冊函式,它不同與select函式是在監聽事件時告訴核心要監聽什麼型別的事件,而是在這裡先註冊要監聽的事件型別。

引數:epfd:要操作的事件表的檔案描述符

op:指定要操作的型別

1)epoll_ctl_add:往事件表中註冊fd上的事件

2)epoll_ctl_mod:修改fd上的註冊事件

3)epoll_ctl_del:刪除fd上的註冊事件

event:指定事件,它是epoll_event結構型別的指標。

其中events成員描述事件型別。epoll支援的事件型別和poll基本相同。表示epoll事件型別的巨集是在poll對應的巨集前加上「e」;data成員用於儲存使用者資料。

3、epoll_wait函式:在一段超時時間內等待一組檔案描述符上的事件。

該函式成功時返回就緒的檔案描述符的個數,失敗時返回-1並設定errno。

epoll_wait函式如果檢測到事件,就將所有就緒事件從核心事件表(由epfd引數指定)中複製到它的第二個引數events指向的陣列中。這個陣列只用於輸出epoll_wait檢測到的就緒事件。

maxevents:告訴核心這個events引數有多大,這個maxevents的值不能小於建立epoll_create()時的size。

#include#include#include#define listen_back_log 10

//建立 監聽套接字

int startup(char* ip,int port)

int op=1;

setsockopt(sock,sol_socket,so_reuseaddr,&op,sizeof(int));

struct sockaddr_in local;

local.sin_family=af_inet;

local.sin_port=htons(port);

local.sin_addr.s_addr=inet_addr(ip);

if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0)

if(listen(sock,listen_back_log)<0)

return sock;

}int main(int argc,char* argv)

int listen_sock=startup(argv[1],atoi(argv[2]));

//建立 epoll 控制代碼 事件表

int epfd=epoll_create(101);//這裡數字不固定, 101只是告訴核心預計用101個檔案描述符,但實際這個引數不起作用

if(epfd<0)

struct epoll_event event;

event.events=epollin;//讀 事件 列表

event.data.fd=listen_sock;

//向事件表中增加事件

epoll_ctl(epfd,epoll_ctl_add,listen_sock,&event);

struct epoll_event fd_events[100];

int size=sizeof(fd_events)/sizeof(fd_events[0]);

int i=0;

for(i=0;i%s:%d\n",inet_ntoa(peer.sin_addr),ntohs(peer.sin_port));

event.events=epollin;

event.data.fd=new_sock;

//將new_sock 新增進核心事件表

IO復用模型 epoll

參見 1.epoll模型簡介 epoll是linux多路服用io介面select poll的加強版,e對應的英文單詞就是enhancement,中文翻譯為增強,加強,提高,充實的意思。所以epoll模型會顯著提高程式在大量併發連線中只有少量活躍的情況下的系統cpu利用率。epoll把使用者關心的檔案...

IO復用 epoll函式

由於poll 和select 的侷限,2.6核心以上引用了event poll機制 就是說的epoll 雖然比前2個實現複雜得多,epoll解決了它們共有的基本效能問題,並增加了新的特性。poll 和select 每次呼叫的時候,都需要所有被監聽的檔案的描述符。核心必須遍歷所有被監視的檔案描述符。當...

IO復用 epoll系列系統呼叫

1 核心事件表 epoll是linux特有的i o復用函式。epoll把使用者關心的檔案描述上的事件放在核心裡的乙個事件表中,並用乙個額外的檔案描述符來標識該核心事件表。這個額外檔案描述符使用函式epoll create函式來建立。includeint epoll create int size s...