要用epoll實現多路IO轉接需要用的epoll_create()
、epoll_ctl()
、epoll_wait()
三個函數
一、epoll_create(int size):創建一棵監聽紅黑樹
本質是一棵平衡二叉樹(紅黑樹)
參數size:創建紅黑樹的監聽節點數量(但這個數僅供內核參考
返回值:成功指向新創建的紅黑樹的根節點fd;失敗返回-1和errno
二、epoll_ctrl:操作監聽紅黑樹
參數1:epfd是epoll_create的函數返回值,就是圖中的那個根節點
參數2:op 對該監聽紅黑樹所做的操作(添加、修改、刪除)
EPOLL_CTL_ADD:添加fd到監聽紅黑樹上
EPOLL_CTL_MOD:修改fd在監聽紅黑樹上的監聽事件
EPOLL_CTL_DEL:將一個fd從監聽紅黑樹上摘下(取消監聽)
參數3:fd 待監聽的fd
參數4:event 本質是struct epoll_event的一個結構體,有兩個成員分別是①events:有EPLOOIN、EPOLLOUT、EPOLLERR;另一個成員②data是一個聯合體,裏有fd對應監聽事件的fd、一個泛型指針void*ptr、另外兩個unit32_t類型和unit64_t類型的變量不用
epoll_ctl函數返回值:成功0,失敗-1並errno
三、int epoll_wait() 阻塞監聽
參數1:epfd,是epoll_create()函數的返回值
參數2:events, 是一個數組,是一個傳出參數,傳出滿足監聽條件的fd結構體,就不用像前兩個select和poll一樣要去輪詢找滿足事件啦
參數3:maxevents, 數組元素的總個數,1024
參數4:timeout ,設-1爲阻塞,設0表示非阻塞立即返回,設>0則爲指定的毫秒數
int epoll_wait()的返回值:大於0表示返回滿足監聽的總個數,可以用作循環上限;返回0表示沒有fd滿足監聽事件;返回-1表示失敗,並errno