epoll 邊沿觸發 可讀可寫事件


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聯系在一起,不過目前相關文檔並不是很全面,本文會進一步跟進。

 

  1. 聯合體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事件時。
---------------------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM