關於epoll的小應用

2021-05-04 16:12:09 字數 2484 閱讀 5580

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(int size)

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

2、epoll_ctl函式

函式宣告:int epoll_ctl(int epfd, int op, int fd, 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(int epfd,struct epoll_event * events,int maxevents,int timeout)

該函式用於輪詢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)

opts = opts|o_nonblock;

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

}int main()

setnonblocking(connfd);

char *str = inet_ntoa(clientaddr.sin_addr);

std::cout<<"connect from "<_u115 ?tr

ev.data.fd=connfd;

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

ev.events=epollin|epollet;

//註冊ev

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

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

else

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

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

ev.data.fd=sockfd;

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

ev.events=epollout|epollet;

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

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

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

}

關於epoll的示例

下午研究了一下epoll,參考了以下的部落格綜合寫了乙個例子。這篇文章中有一些和我從man上面查到的不相符合的地方,特此指出。1 關於epoll create 這個函式的size引數已經器用。更推薦使用的是epoll create1 0 來代替普通的用法。另外epoll create1 epollc...

關於epoll檢測非同步連線的方法

因為epoll本身沒有明確提出當非同步connect成功之後會返回什麼樣的訊號,通過測試有如下結果 1,當本地還沒呼叫connect函式,卻將套接字送交epoll檢測,epoll會產生一次 epollout epollhup,也就是產生乙個值為0x14的events.2,當本地connect事件發生...

linux下關於epoll的簡單介紹

在linux的man文件中,我們可以看到如下定義 epoll i o event notification facility epoll是一種 i o事件 通知機制 i o事件 基於file descriptor,支援file,socket,pipe等各種i o方式 當檔案描述符關聯的核心讀緩衝區可...