多路 IO 转接 :epoll 函数
因為 select 和 poll 的返回值特性,所以想判斷到底哪個文件描述符發(fā)生了事件,需要遍歷文件描述符表,因此,在“高并發(fā)、少訪問”情況下,比如 1000 個連接,就 3 個發(fā)了數(shù)據(jù),select 和 poll 效率就很低。
理想狀態(tài):內核直接告訴我“哪個文件描述符”發(fā)生了“什么事件”:此功能對應于epoll 模型。
(1)頭文件
(2)函數(shù)
1)創(chuàng)建一個 epoll 句柄:
參數(shù): 監(jiān)聽文件描述符的數(shù)目(是一個建議值,內核可能會適時擴充)。
返回值:一個文件描述符,指向一個紅黑樹的樹根(參數(shù) size 其實就是反應了樹的大小)。
使用:
2)控制某個 epoll 監(jiān)控的文件描述符上的事件:注冊、修改、刪除。
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)參數(shù) 1:epoll 句柄,epoll_create 函數(shù)返回值。
參數(shù) 2: 用 3 個宏,表示執(zhí)行動作 (控制樹上結點),
EPOLL_CTL_ADD :注冊新的 fd 到 epfd (上樹:添加結點);
EPOLL_CTL_MOD :修改已經(jīng)注冊的 fd 的監(jiān)聽事件 (修改結點);
EPOLL_CTL_DEL :從 epfd 刪除一個 fd (下樹:刪除結點)。
參數(shù) 3:f要監(jiān)聽的文件描述符(即 參數(shù) 2 中控制的結點)
參數(shù) 4: 告訴內核需要監(jiān)聽誰的什么事件 ,是傳入?yún)?shù)。
聯(lián)合體
typedef union epoll_data { void *ptr; int fd; // 返回有事件的文件描述符,其實就是參數(shù) 3uint32_t u32;uint64_t u64;} epoll_data_t;返回值:成功返回0; 失敗返回-1,并設置 errno。
使用:
3)等待所監(jiān)控文件描述符上有事件的產(chǎn)生,類似于 select 函數(shù)調用。
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)參數(shù) 1:epoll 句柄,epoll_create 函數(shù)返回值。
參數(shù) 2:struct epoll_event *events
注意:這里的參數(shù)2與 epoll_ctl 函數(shù)參數(shù) 4 的區(qū)別:
epoll_ctl 函數(shù) 參數(shù) 4:是我告訴內核,我想監(jiān)聽某個文件描述符的某個事件,因此,使用上是傳入?yún)?shù),先定義賦值,再傳入結構體地址(本質);
epoll_wait 函數(shù) 參數(shù) 2:目的是讓內核告訴我哪些文件描述符發(fā)生了哪些事件,使用上是傳出參數(shù),因為數(shù)量多個,因此本質是結構體數(shù)組首地址。
參數(shù) 3:結構體數(shù)組容量
參數(shù) 4: int 型 : -1代表永久阻塞,直到監(jiān)控事件發(fā)生;0代表立即返回,不阻塞進程; > 0代表等待指定的毫秒數(shù)。
返回值:成功返回所監(jiān)聽的所有的滿足條件的文件描述符總數(shù)量;失敗返回 -1,設置 errno。
使用:
總結
以上是生活随笔為你收集整理的多路 IO 转接 :epoll 函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多路 IO 转接 :poll 函数
- 下一篇: epoll 版 高并发服务器