4、epoll函数
1、常用函數
??? 有:epoll_create, epoll_ctl和epoll_wait。Linux-2.6.19又引入了可以屏蔽指定信號的epoll_wait: epoll_pwait。至此epoll家族已全。其中epoll_create用來創建一個epoll文件描述符,epoll_ctl用來添加/修改/刪除需要偵聽的文件描述符及其事件,epoll_wait/epoll_pwait接收發生在被偵聽的描述符上的,用戶感興趣的IO事件。epoll文件描述符用完后,直接用close關閉即可,非常方便。事實上,任何被偵聽的文件符只要其被關閉,那么它也會自動從被偵聽的文件描述符集合中刪除,很是智能。
每次添加/修改/刪除被偵聽文件描述符都需要調用epoll_ctl,所以要盡量少地調用epoll_ctl,防止其所引來的開銷抵消其帶來的好處。有的時候,應用中可能存在大量的短連接(比如說Web服務器),epoll_ctl將被頻繁地調用,可能成為這個系統的瓶頸。
2、函數簡介
#include <sys/epoll.h>
(1)創建
int epoll_create(int size);
創建一個epoll的句柄,size用來告訴內核這個監聽的數目一共有多大,內核2.6.8后沒有意義,大于0即可。注意,select()中的第一個參數,是給出最大監聽的fd+1的值。當創建好epoll句柄后,它就是會占用一個fd值,在linux下如果查看/proc/進程id/fd/,是能夠看到這個fd的,所以在使用完epoll后,必須調用close()關閉,否則可能導致fd被耗盡。
(2)注冊
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
epoll的事件注冊函數,它不同與select()是在監聽事件時告訴內核要監聽什么類型的事件,而是在這里先注冊要監聽的事件類型。第一個參數是epoll_create()的返回值,第二個參數表示動作,用三個宏來表示:
EPOLL_CTL_ADD:注冊新的fd到epfd中;
EPOLL_CTL_MOD:修改已經注冊的fd的監聽事件;
EPOLL_CTL_DEL:從epfd中刪除一個fd;
第三個參數是需要監聽的fd,第四個參數是告訴內核需要監聽什么事,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 */
};
(3)等待事件的發生
int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout);
等待事件的產生,類似于select()調用。events:返回的epoll事件的數組;maxevent:每次能處理的事件數;
timeout:超時值,以毫秒計;-1表示無限期等待
返回值
>0:事件個數
=0:超時
-1:出錯
再執行該函數成功后,進行連接處理過程中,來的新的連接請求,將加入下一次處理的集合中。
??? 在許多測試中我們會看到如果沒有大量的idle-connection或者dead-connection,epoll的效率并不會比select/poll高很多,但是當我們遇到大量的idle-connection(例如WAN環境中存在大量的慢速連接),就會發現epoll的效率大大高于select/poll。
轉載于:https://www.cnblogs.com/mydomain/archive/2011/09/02/2163275.html
總結
- 上一篇: iis负载均衡与文件同步[网摘]
- 下一篇: java中日期加减计算(转)