epoll的相關系統調用
epoll_create()
epoll_ctl()
epoll_wait()
int epoll_create(int size);
創建一個epoll的句柄。
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epoll的事件注冊函數。
1. 第一個參數是epoll_create()的返回值。
2. 第二個參數表示動作,用三個宏來表示:
EPOLL_CTL_ADD:注冊新的fd到epfd中;
EPOLL_CTL_MOD:修改已經注冊的fd的監聽事件;
EPOLL_CTL_DEL:從epfd中刪除一個fd。
3. 第三個參數是需要監聽的fd。
4. 第四個參數是告訴內核需要監聽什麼事。
struct epoll_event結構如下:
typedef union epoll_data
{//保存觸發事件的某個文件描述符相關的數據
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;
struct epoll_event
{
__uint32_t events;/* Epoll events */
epoll_data_t data;/* User data variable */
};
events可以是以下幾個宏的集合:
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);
收集在epoll監控的事件中已經發生的事件。
Edge Triggered 工作模式
@ 基於非阻塞文件句柄
@ 只有當read()或者write()返回EAGAIN時才需要掛起,等待。
但這並不是說每次read()時都需要循環讀,直到讀到產生一個EAGAIN才認為此次事件處理完成,當read()返回的讀到的數據長度小於請求的數據長度時,就可以確定此時緩沖中已沒有數據了,也就可以認為此事讀事件已處理完成。