EPOLL為我們帶來了什麼

2021-05-27 08:25:06 字數 4107 閱讀 1958

epoll與iocp的異同之處

linux 2.6核心epoll用法舉例說明

linux 2.6核心epoll用法舉例說明(zz from www.csdn.net)

epoll用到的所有函式都是在標頭檔案sys/epoll.h中宣告的,下面簡要說明所用到的資料結構和函式:

所用到的資料結構

typedef union epoll_data epoll_data_t;

struct epoll_event ;

結構體epoll_event 被用於註冊所感興趣的事件和回傳所發生待處理的事件,其中epoll_data 聯合體用來儲存觸發事件的某個檔案描述符相關的資料,例如乙個client連線到伺服器,伺服器通過呼叫accept函式可以得到於這個client對應的socket檔案描述符,可以把這檔案描述符賦給epoll_data的fd欄位以便後面的讀寫操作在這個檔案描述符上進行。epoll_event 結構體的events欄位是表示感興趣的事件和被觸發的事件可能的取值為:epollin:表示對應的檔案描述符可以讀;

epollout:表示對應的檔案描述符可以寫;

epollpri:表示對應的檔案描述符有緊急的資料可讀(我不太明白是什麼意思,可能是類似client關閉 socket連線這樣的事件);

epollerr:表示對應的檔案描述符發生錯誤;

epollhup:表示對應的檔案描述符被結束通話;

epollet:表示對應的檔案描述符有事件發生;

所用到的函式:

1、epoll_create函式

函式宣告:int epoll_create(intsize)

該函式生成乙個epoll專用的檔案描述符,其中的引數是指定生成描述符的最大範圍(我覺得這個引數和select函式的第乙個引數應該是類似的但是該怎麼設定才好,我也不太清楚)。

2、epoll_ctl函式

函式宣告:int epoll_ctl(intepfd, intop, intfd, struct epoll_event *event)

該函式用於控制某個檔案描述符上的事件,可以註冊事件,修改事件,刪除事件。

引數:epfd:由epoll_create生成的epoll專用的檔案描述符;

op:要進行的操作例如註冊事件,可能的取值epoll_ctl_add註冊、epoll_ctl_mod

改、epoll_ctl_del刪除

fd:關聯的檔案描述符;

event:指向epoll_event的指標;

如果呼叫成功返回0,不成功返回-1

3、epoll_wait函式

函式宣告:int epoll_wait(intepfd,struct epoll_event *events,intmaxevents,inttimeout)

該函式用於輪詢i/o事件的發生;

引數:epfd:由epoll_create生成的epoll專用的檔案描述符;

epoll_event:用於回傳代處理事件的陣列;

maxevents:每次能處理的事件數;

timeout:等待i/o事件發生的超時值;

返回發生事件數。

例子:#include

#include

#include

#include

#include

#include

#include

#include

#define maxline 10

#define open_max 100

#define listenq 20

#define serv_port 5555

#define inftim 1000

void setnonblocking(int sock)

int opts;

opts=fcntl(sock,f_getfl);

if(opts<0)

perror("fcntl(sock,getfl)");

exit(1);

opts = opts|o_nonblock;

if(fcntl(sock,f_setfl,opts)<0)

perror("fcntl(sock,setfl,opts)");

exit(1);

int main()

int i, maxi, listenfd, connfd, sockfd,epfd,nfds;

ssize_t n;

char line[maxline];

socklen_t clilen;

//宣告epoll_event結構體的變數,ev用於註冊事件,陣列用於回傳要處理的事件

struct epoll_event ev,events[20];

//生成用於處理accept的epoll專用的檔案描述符

epfd=epoll_create(256);

struct sockaddr_in clientaddr;

struct sockaddr_in serveraddr;

listenfd = socket(af_inet, sock_stream, 0);

//把socket設定為非阻塞方式

setnonblocking(listenfd);

//設定與要處理的事件相關的檔案描述符

ev.data.fd=listenfd;

//設定要處理的事件型別

ev.events=epollin|epollet;

//註冊epoll事件

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

bzero(&serveraddr, sizeof(serveraddr));

serveraddr.sin_family = af_inet;

char *local_addr="200.200.200.204";

inet_aton(local_addr,&(serveraddr.sin_addr));//htons(serv_port);

serveraddr.sin_port=htons(serv_port);

bind(listenfd,(sockaddr *)&serveraddr, sizeof(serveraddr));

listen(listenfd, listenq);

maxi = 0;

for ( ; ; ) else

std::cout<<"readline error"<} else if (n == 0) {

close(sockfd);

events[i].data.fd = -1;

//設定用於寫操作的檔案描述符

ev.data.fd=sockfd;

//設定用於注測的寫操作事件

ev.events=epollout|epollet;

//修改sockfd上要處理的事件為epollout

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

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

sockfd = events[i].data.fd;

write(sockfd, line, n);

//設定用於讀操作的檔案描述符

ev.data.fd=sockfd;

//設定用於注測的讀操作事件

ev.events=epollin|epollet;

//修改sockfd上要處理的事件為epolin

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

EPOLL為我們帶來了什麼

epoll為我們帶來了什麼 epoll的操作就這麼簡單,總共不過4個api epoll create,epoll ctl,epoll wait和close.但凡作過比較深入的網路程式設計的人,都會知道,在win平台下,高效的io模型是iocp,而在linux底下則是epoll。那麼,epoll與io...

Epoll為我們帶來什麼

q 網路伺服器的瓶頸在哪?a io效率。自從linux提供了 dev epoll的裝置以及後來2.6核心中對 dev epoll裝置的訪問的封裝 system epoll 之後,這種現象得到了大大的緩解,如果說幾個月前,大家還對epoll不熟悉,那麼現在來說的話,epoll的應用已經得到了大範圍的普...

OPC給我們帶來了什麼

眾說紛紜opc,說有什麼好處了,好像只要opc了,一下就ok了,冷靜的想一下也沒那麼多好處。opc只是提供了一種廠商之間的介面,尤其是在硬體提供商和軟體提供商之間可以完全實現各自開發自己的產品。大家都符合這個規範,以後用的時候就不用考慮怎麼實現硬體和軟體的互聯,而只用關心系統是如何實現 怎麼能更快更...