Linux系統IO多路復用之epoll

2021-10-04 01:54:31 字數 2233 閱讀 6358

epoll_create函式

int epoll_create(int size);
建立乙個epoll的控制代碼,size指定需要監聽描述符的最大數量。該函式返回乙個fd,在使用完epoll之後需要呼叫close()關閉,否則可能導致fd耗盡。

epoll_ctl函式

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epoll事件註冊函式,引數解釋:

epfd:通過epoll_create函式獲得的epoll控制代碼。

op:操作的型別,有三種操作用三個巨集表示: 巨集

說明epoll_ctl_add

註冊新fd進入epfd中

epoll_ctl_mod

修改已經註冊的fd的監聽事件

epoll_ctl_del

從epfd中刪除乙個fd

fd:要監聽的檔案描述符

event:需要監聽的事件,struct epoll_event結構如下:

typeof union epoll_data epoll_data_t;

struct epoll_event

events可以以下幾個巨集的集合:巨集事件

epollin

檔案描述符可讀

epollout

檔案描述符可寫

epollpri

檔案描述符有緊急資料可讀

epollerr

檔案描述符發生錯誤

epollhup

檔案描述符被結束通話

epollet

將epoll設為邊緣觸發

epolloneshot

只監聽一次事件,之後再需監聽,需要再次註冊

epoll_wait函式

int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
epoll_wait函式等待監視的事件發生,引數解釋:

epfd:通過epoll_create函式建立的epoll控制代碼。

events:乙個陣列,核心監視到發生的事件集合。

maxevents:events中元素數量最大值,不能超過epoll_create時的size。

timeout:超時時間。單位為毫秒:0立即返回,-1永久阻塞。

epoll_wait函式返回值為需要處理事件的數目,如返回值為0則表示已超時。

epoll兩種工作模式

lt:水平觸發

et:邊緣觸發

簡單地說,水平觸發會一直觸發,這一點和select和poll相同,而邊緣觸發只會觸發一次,這是epoll特有的。

若採用了et模式,需要一直read/write直到出錯為止。

使用et模式可以便捷地處理epollout事件,省去了開啟與關閉epollout的epoll_ctl函式呼叫。

epoll使用模板

int listen_sock=startup(8080);

struct sockaddr_in remote;

socklen_t len=sizeof(struct sockaddr_in);

int epfd=epoll_create(1024);

struct epoll_event events[1024],ev;

ev.data.fd=listen_sock;

ev.events=epollin;

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

for(;;)

else if(events[i].events&epollin)

ev.data.fd=client_sock;

ev.events=epollout;

epoll_ctl(epfd,epoll_ctl_mod,client_sock,&ev);

}else if(events[i].events&epollout)

ev.data.fd=client_sock;

ev.events=epollin;

epoll_ctl(epfd,epoll_ctl_mod,client_sock,&ev);}}

}close(listen_sock);

close(epfd);

IO多路復用之select poll以及epoll

處理執行態的程序 獲得cpu資源 由於需要等待一些事件的傳送而不能繼續執行時,就會祖東的轉為阻塞狀態,這是,他是不占用cpu資源的。因此也只有處於執行態的程序,才能夠轉為阻塞狀態。這時候排程器會切換到其他程序,一旦這個程序等待的事件發生了,那麼就會重新喚醒這個程序,重新等待被排程。一旦被排程器排程,...

Linux系統IO多路復用之select

include includeint select int maxfd,fd set readset,fd set writeset,fd set exceptset,const struct timeval timeout 引數介紹 maxfd 最大描述符數量 1 readset 指定核心測試讀的...

I O多路復用之poll

poll的優點 1 poll 不要求開發者計算最大檔案描述符加一的大小。2 poll 在應付大數目的檔案描述符的時候速度更快,相比於select。3 它沒有最大連線數的限制,原因是它是基於鍊錶來儲存的。poll的缺點 1 大量的fd的陣列被整體複製於使用者態和核心位址空間之間,而不管這樣的複製是不是...