首先看一下epoll的幾個函式的介紹。
/**
* * @param size size就是你在這個epoll fd上能關注的最大socketfd數
* * @return 生成的檔案描述符
*/int epoll_create(int size);
/* listener為socket檔案描述符,kdpfd為epoll檔案描述符 */
int listener, kdpfd;
struct sockaddr_in my_addr;
/* 建立socket */
if ((listener =socket(pf_inet, sock_stream, 0)) == -1)
bzero(&my_addr,sizeof(my_addr));
my_addr.sin_family = pf_inet;
my_addr.sin_port = htons(port);
my_addr.sin_addr.s_addr =inaddr_any;
/* 繫結socket */
if (bind(listener, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
/*監聽socket */
if (listen(listener, lisnum)== -1)
/* 以上初始化完成後,建立epoll 控制代碼,
也可以先建立epoll控制代碼,再初始化socket */
kdpfd =epoll_create(maxepollsize);
/**
* @brief 該函式用於控制某個epoll檔案描述符上的事件,可以註冊事件,修改事件,刪除事件。
* * @param epfd 由 epoll_create 生成的epoll專用的檔案描述符
* @param op 要進行的操作例如註冊事件,可能的取值epoll_ctl_add 註冊、epoll_ctl_mod 修 改、epoll_ctl_del 刪除
* @param fd 關聯的檔案描述符
* @param event 指向epoll_event的指標
* * @return 0 succ
* -1 fail
*/int epoll_ctl(int epfd,int op,int fd,structepoll_event*event);
其中用到的資料結構結構如下:
typedef union epoll_data epoll_data_t;
struct epoll_event ;
常用的事件型別:
epollin :表示對應的檔案描述符可以讀;
epollout:表示對應的檔案描述符可以寫;
epollpri:表示對應的檔案描述符有緊急的資料可讀
epollerr:表示對應的檔案描述符發生錯誤;
epollhup:表示對應的檔案描述符被結束通話;
epollet: 表示對應的檔案描述符有事件發生;
struct epoll_event ev;
//設定要處理的事件型別
ev.events =epollin | epollet;
//設定與要處理的事件相關的檔案描述符
ev.data.fd =listener;
//註冊epoll事件,將監聽的socket加入epoll
if (epoll_ctl(kdpfd,epoll_ctl_add, listener, &ev) < 0)
/**
* @brief 該函式用於輪詢i/o事件的發生
* * @param epfd 由epoll_create 生成的epoll專用的檔案描述符
* @param events 用於回傳代處理事件的陣列
* @param maxevents 每次能處理的事件數
* @param timeout 等待i/o事件發生的超時值;-1相當於阻塞,0相當於非阻塞。一般用-1即可
* * @return >=0 返回發生事件數
* -1 錯誤
*/int epoll_wait(int epfd,structepoll_event* events,int maxevents,int timeout);
struct epoll_event events[maxepollsize];
while (1)
/* 處理所有事件 */
for (n = 0; n else
setnonblocking(new_fd);
ev.events = epollin | epollet;
ev.data.fd = new_fd;
if (epoll_ctl(kdpfd,epoll_ctl_add, new_fd, &ev) < 0)
curfds++;
}else}}
}close(listener);
epoll 學習筆記
epoll有兩種模式,edge triggered 簡稱et 和 level triggered 簡稱lt 在採用這兩種模式時要注意的是,如果採用et模式,那麼僅當狀態發生變化時才會通知,而採用lt模式類似於原來的 select poll操作,只要還有沒有處理的事件就會一直通知.以 來說明問題 首先...
epoll學習筆記
epoll學習筆記 epoll有兩種模式,edge triggered 簡稱et 和 level triggered 簡稱lt 在採用這兩種模式時要注意的是,如果採用et模式,那麼僅當狀態發生變化時才會通知,而採用lt模式類似於原來的select poll操作,只要還有沒有處理的事件就會一直通知.以...
epoll學習筆記
epoll有兩種模式,edge triggered 簡稱et 和 level triggered 簡稱lt 在採用這兩種模式時要注意的是,如果採用et模式,那麼僅當狀態發生變化時才會通知,而採用lt模式類似於原來的 select poll操作,只要還有沒有處理的事件就會一直通知.以 來說明問題 首先...