epoll學習

一、概述:與select和poll相似,epoll也是異步網絡通訊模型,但運行效率更高。數組

 

二、epoll接口:網絡

2.1  int epoll_create(int size);異步

epoll_create建立一個cpoll實例,並返回該實例的文件描述符fd,當中止使用epoll時,須要close這個fd。ui

參數:size,表示該epoll最多監聽的fd數量。epoll實際處理中並不關注這個size,也就是說epoll理論上是沒有監聽數量上限的,只要size大於0便可。接口

2.2 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);隊列

epoll_ctl用於向先前經過epoll_create建立的epoll實例中操做fd。事件

參數1:epfd,由epoll_create建立的epoll的fd。ip

參數2:op,具體操做,有三個值:EPOLL_CTL_ADD(向epoll中添加fd)、EPOLL_CTL_MOD(修改epoll中已添加fd所關注的事件)和EPOLL_CTL_DEL(刪除epoll中的fd)。it

參數3:fd,待處理的fd。io

參數4:參數3的fd所關注的事件。若操做爲EPOLL_CTL_DEL,則不須要攜帶參數4.

The event argument describes the object linked to the file descriptor fd. The struct epoll_event is defined as:

typedef union epoll_data {
    void *ptr;
   int fd;      //對應於參數3
   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事件包括:EPOLLIN(fd可讀)、EPOLLOUT(fd可寫)、EPOLLERR(fd異常)、EPOLLET(邊沿觸發)等。

2.3、int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

經過epoll_wait來批量獲取有狀態變化的fd,返回值爲fd的數量。

參數1:epfd,由epoll_create建立。

參數2:events是一個數組,應用程序經過events從內核獲取有事件發生的fd的信息,經過events[i].events來與EPOLLIN等進行與操做來判斷fd發生了什麼事件。

參數3:maxevents與參數2相對應,表示events這個數組的數量,通常不用太大。

參數4:epoll_wait阻塞時間。timeout爲0,則epoll在判斷epoll的fd就緒隊列便當即返回。timeout大於0,那麼epoll中會阻塞相應時間才返回。timeout小於0,則

epoll將無限阻塞下去,直到有事件發生才退出。根據實際需求來設置timeout的數值,設置任意值都可。

 

三、實例:參考 Linux Programmer's Manual中對epoll 的介紹及使用方法,epoll的使用模型大多類似,根據實際業務需求進行適配便可。

相關文章
相關標籤/搜索