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()
{
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 ( ; ; ) {
//等待epoll事件的發生
nfds=epoll_wait(epfd,events,20,500);
//處理所發生的所有事件
for(i=0;i
linux2 6核心epoll用法舉例說明zz
epoll用到的所有函式都是在標頭檔案sys epoll.h中宣告的,下面簡要說明所用到的資料結構和函式 所用到的資料結構 typedef union epoll data epoll data t struct epoll event 結構體epoll event 被用於註冊所感興趣的事件和回傳所...
Linux 2 6核心編譯,核心公升級
本文描述了在fc8下公升級linux核心為2.6.25的詳細步驟.1.首先從如下 得到linux 2.6.25.2.然後在 usr src下untar這個包.tar xjfv linux 2.6.25.tar.bz2 3.配置核心 cd usr src linux 2.6.25 make mrpro...
Linux2 6核心啟動分析
我們已知u boot的終極目的是啟動核心,那麼核心啟動的開始必定是u boot傳入的引數。開啟armlinux.c 發現有一行的 為 thekernel 0,bd bi arch number,bd bi boot params 帶入三個引數 第乙個引數是0,第二個引數是機器id,第三個引數是引數所...