epoll函數


頭文件:

#include<sys/epoll.h>

數據結構

epoll函數中所使用到的數據結構:

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 /
};

結構體epoll_event 被用於註冊所感興趣的事件和回傳所發生待處理的事件。
events字段是表示感興趣的事件和被觸發的事件可能的取值爲:
-EPOLLIN :表示對應的文件描述符可以讀;
-EPOLLOUT:表示對應的文件描述符可以寫;
-EPOLLPRI:表示對應的文件描述符有緊急的數據可讀
-EPOLLERR:表示對應的文件描述符發生錯誤;
-EPOLLHUP:表示對應的文件描述符被掛斷;
-EPOLLET:表示對應的文件描述符設定爲edge模式;
epoll_data 聯合體用來保存觸發事件的某個文件描述符相關的數據。例如一個client連接到服務器,服務器通過調用accept函數可以得到於這個client對應的socket文件描述符,可以把這文件描述符賦給epoll_data的fd字段以便後面的讀寫操作在這個文件描述符上進行。

注意:
epoll有兩種模式,Edge Triggered(簡稱ET) 和 Level Triggered(簡稱LT)。在採用這兩種模式時要注意的是,如果採用ET模式,那麼僅當狀態發生變化時纔會通知,而採用LT模式類似於原來的select/poll操作,只要還有沒有處理的事件就會一直通知.。
ET(Edge Triggered)與LT(Level Triggered)的主要區別可以從下面的例子看出
eg:
1. 標示管道讀者的文件句柄註冊到epoll中;
2. 管道寫者向管道中寫入2KB的數據;
3. 調用epoll_wait可以獲得管道讀者爲已就緒的文件句柄;
4. 管道讀者讀取1KB的數據
5. 一次epoll_wait調用完成
如果是ET模式,管道中剩餘的1KB被掛起,再次調用epoll_wait,得不到管道讀者的文件句柄,除非有新的數據寫入管道。如果是LT模式,只要管道中有數據可讀,每次調用epoll_wait都會觸發。
另一點區別就是設爲ET模式的文件句柄必須是非阻塞的。

函數

1.epoll_create()

int epoll_create(int size);

該函數生成一個epoll專用的文件描述符,其中的參數是指定生成描述符的最大範圍。

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事件發生的超時值(ms);-1永不超時,直到有事件產生才觸發,0立即返回。
返回值:返回發生事件數,-1有錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章