浅析epoll – epoll函数深入讲解
前一篇大致講了一下epoll是個什么東西,優點等內容,這篇延續上一篇的內容,主要是分析epoll的函數,epoll高性能的深入分析。
epoll的三大函數
1.創建epoll fd函數
int epoll_create(int size);epoll_create()創建一個epoll的事例,通知內核需要監聽size個fd。size指的并不是最大的后備存儲設備,而是衡量內核內部結構大小的一個提示。當創建成功后,會占用一個fd,所以記得在使用完之后調用close(),否則fd可能會被耗盡。
Note:自從Linux2.6.8版本以后,size值其實是沒什么用的,不過要大于0,因為內核可以動態的分配大小,所以不需要size這個提示了。
創建還有另外一個函數
int epoll_create1(int flag);這個函數是在linux 2.6.27中加入的,當你在看陳碩的muduo時可以看到這個函數,其實它和epoll_create差不多,不同的是epoll_create1函數的參數是flag,當flag是0時,表示和epoll_create函數完全一樣,不需要size的提示了。
當flag = EPOLL_CLOEXEC,創建的epfd會設置FD_CLOEXEC
當flag = EPOLL_NONBLOCK,創建的epfd會設置為非阻塞
一般用法都是使用EPOLL_CLOEXEC.
Note:關于FD_CLOEXEC,現在網上好多都說的有點問題,我翻閱了一些資料,請教了一些人,大約明白它的意思了。
它是fd的一個標識說明,用來設置文件close-on-exec狀態的。當close-on-exec狀態為0時,調用exec時,fd不會被關閉;狀態非零時則會被關閉,這樣做可以防止fd泄露給執行exec后的進程。關于exec的用法,大家可以去自己查閱下,或者直接man exec。
2.epoll事件的注冊函數
int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event);select是在監聽時告訴內核要監聽的事件,而epoll_ctl是先注冊需要監聽的事件。
第一個參數epfd,為epoll_create返回的的epoll fd。
第二個參數op表示操作值。有三個操作類型,
EPOLL_CTL_ADD? // 注冊目標fd到epfd中,同時關聯內部event到fd上EPOLL_CTL_MOD // 修改已經注冊到fd的監聽事件EPOLL_CTL_DEL // 從epfd中刪除/移除已注冊的fd,event可以被忽略,也可以為NULL第三個參數fd表示需要監聽的fd。
第四個參數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 */ };event參數是一個枚舉的集合,可以用” | “來增加事件類型,枚舉如下:
EPOLLIN:表示關聯的fd可以進行讀操作了。
EPOLLOUT:表示關聯的fd可以進行寫操作了。
EPOLLRDHUP(since?Linux?2.6.17):表示套接字關閉了連接,或者關閉了正寫一半的連接。
EPOLLPRI:表示關聯的fd有緊急優先事件可以進行讀操作了。
EPOLLERR:表示關聯的fd發生了錯誤,epoll_wait會一直等待這個事件,所以一般沒必要設置這個屬性。
EPOLLHUP:表示關聯的fd掛起了,epoll_wait會一直等待這個事件,所以一般沒必要設置這個屬性。
EPOLLET:設置關聯的fd為ET的工作方式,epoll的默認工作方式是LT。
EPOLLONESHOT (since Linux 2.6.2):設置關聯的fd為one-shot的工作方式。表示只監聽一次事件,如果要再次監聽,需要把socket放入到epoll隊列中。
3.epoll等待事件函數
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
int epoll_pwait(int epfd, struct epoll_event *events, int maxevents, int timeout,? const sigset_t *sigmask);
上面兩個函數的參數含義:
第一個參數:表示epoll_wait等待epfd上的事件
第二個參數:events指針攜帶有epoll_data_t數據
第三個參數:maxevents告訴內核events有多大,該值必須大于0
第四個參數:timeout表示超時時間(單位:毫秒)
epoll_pwait(since linux 2.6.19)允許一個應用程序安全的等待,直到fd設備準備就緒,或者捕獲到一個信號量。其中sigmask表示要捕獲的信號量。
函數如果等待成功,則返回fd的數字;0表示等待fd超時,其他錯誤號請查看errno
函數到這里就講完了,下一篇會寫一個例子給大家看下這些函數是如何使用的。
轉載請注明:C++愛好者博客???淺析epoll – epoll函數深入講解
總結
以上是生活随笔為你收集整理的浅析epoll – epoll函数深入讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: realarm Android系统编译后
- 下一篇: 浅析epoll-为何多路复用I/O要使用