https://blog.csdn.net/lihao21/article/details/67631516
http://blog.lucode.net/linux/epoll-tutorial.html
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 */ };
其中,data是一個聯合體,能夠存儲fd或其它數據,我們需要根據自己的需求定制。events表示監控的事件的集合,是一個狀態值,通過狀態位來表示,可以設置如下事件:
- EPOLLERR : 文件上發上了一個錯誤。這個事件是一直監控的,即使沒有明確指定
- EPOLLHUP : 文件被掛斷。這個事件是一直監控的,即使沒有明確指定
- EPOLLRDHUP : 對端關閉連接或者shutdown寫入半連接
- EPOLLET : 開啟邊緣觸發,默認的是水平觸發,所以我們並未看到EPOLLLT
- EPOLLONESHOT : 一個事件發生並讀取后,文件自動不再監控
- EPOLLIN : 文件可讀
- EPOLLPRI : 文件有緊急數據可讀
- EPOLLOUT : 文件可寫
- EPOLLWAKEUP : 如果EPOLLONESHOT和EPOLLET清除了,並且進程擁有CAP_BLOCK_SUSPEND權限,那么這個標志能夠保證事件在掛起或者處理的時候,系統不會掛起或休眠
注意一下,EPOLLHUP並不代表對端結束了連接,這一點需要和EPOLLRDHUP區分。通常情況下EPOLLHUP表示的是本端掛斷,造成這種事件出現的原因有很多,其中一種便是出現錯誤,更加細致的應該是和RST聯系在一起,不過目前相關文檔並不是很全面,本文會進一步跟進。
- 聯合體data中的那個ptr是很有用的,只不過這就意味着你將該對象的生命周期交給了epoll,不排除會有潛在bug的影響,需要輔以timeout
ncat命令進行測試
$ ncat 127.0.0.1 8000
http://blog.chinaunix.net/uid/28541347/sid-193117-list-1.html
水平觸發
1. 對於讀操作
只要緩沖內容不為空,LT模式返回讀就緒。
2. 對於寫操作
只要緩沖區還不滿,LT模式會返回寫就緒。
邊緣觸發
1. 對於讀操作
(1)當緩沖區由不可讀變為可讀的時候,即緩沖區由空變為不空的時候。
(2)當有新數據到達時,即緩沖區中的待讀數據變多的時候。
(3)當緩沖區有數據可讀,且應用進程對相應的描述符進行EPOLL_CTL_MOD 修改EPOLLIN事件時。
2. 對於寫操作
(1)當緩沖區由不可寫變為可寫時。
(2)當有舊數據被發送走,即緩沖區中的內容變少的時候。
(3)當緩沖區有空間可寫,且應用進程對相應的描述符進行EPOLL_CTL_MOD 修改EPOLLOUT事件時。
---------------------