1.創建一個epoll句柄,參數size用來告訴內核監聽的文件描述符的個數,跟內存大小有關。
#include <sys/epoll.h>
int epoll_create(int size) size:監聽數目
2. 控制某個epoll監控的文件描述符上的事件:註冊、修改、刪除。
#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
epfd: 爲epoll_creat的句柄
op: 表示動作,用3個宏來表示:
EPOLL_CTL_ADD (註冊新的fd到epfd),
EPOLL_CTL_MOD (修改已經註冊的fd的監聽事件),
EPOLL_CTL_DEL (從epfd刪除一個fd);
event: 告訴內核需要監聽的事件
struct epoll_event {
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
typedef union epoll_data {
void *ptr;
int fd;
uint32_t u32;
uint64_t u64;
} epoll_data_t;
EPOLLIN : 表示對應的文件描述符可以讀(包括對端SOCKET正常關閉)
EPOLLOUT: 表示對應的文件描述符可以寫
EPOLLPRI: 表示對應的文件描述符有緊急的數據可讀(這裏應該表示有帶外數據到來)
EPOLLERR: 表示對應的文件描述符發生錯誤
EPOLLHUP: 表示對應的文件描述符被掛斷;
EPOLLET: 將EPOLL設爲邊緣觸發(Edge Triggered)模式,這是相對於水平觸發(Level Triggered)而言的
EPOLLONESHOT:只監聽一次事件,當監聽完這次事件之後,如果還需要繼續監聽這個socket的話,需要再次把這個socket加入到EPOLL隊列裏
3.等待所監控文件描述符上有事件的產生,類似於select()調用。
#include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)
events: 用來存內核得到事件的集合,
maxevents: 告之內核這個events有多大,這個maxevents的值不能大於創建epoll_create()時的size,
timeout: 是超時時間
-1: 阻塞
0: 立即返回,非阻塞
>0: 指定毫秒
返回值: 成功返回有多少文件描述符就緒,時間到時返回0,出錯返回-1