OS / Linux / epoll 各种事件解析
1、監(jiān)聽(tīng)事件
設(shè)置事件為 EPOLLIN? 或者 EPOLLET | EPOLLIN 。
由于此 socket 只監(jiān)聽(tīng)有無(wú)連接,談不上寫和其他操作。故只有這兩類。(默認(rèn)是LT模式,即EPOLLLT |EPOLLIN)。
說(shuō)明:如果在這個(gè) socket上 也設(shè)置 EPOLLOUT 等,也不會(huì)出錯(cuò),只是這個(gè) socket 不會(huì)收到這樣的消息。
2、可讀事件。
EPOLLIN?????
3、可寫事件。
EPOLLOUT
4、客戶端正常關(guān)閉,client 端 close() 連接。
server 會(huì)報(bào)某個(gè) sockfd 可讀,即 EPOLLIN 來(lái)臨。然后 recv 一下 , 如果返回 0 再掉用 epoll_ctl 中的 EPOLL_CTL_DEL,同時(shí) close(sockfd) 。
有些系統(tǒng)會(huì)收到一個(gè) EPOLLRDHUP,當(dāng)然檢測(cè)這個(gè)是最好不過(guò)了。只可惜是有些系統(tǒng)不支持。上面的方法最保險(xiǎn),如果能加上對(duì) EPOLLRDHUP 的處理那就是萬(wàn)能的了。
最近測(cè)試 Ubuntu 18.04 系統(tǒng),當(dāng)對(duì)端執(zhí)行 close() 函數(shù)時(shí),server 收到了事件 8193,即:EPOLLHUP + EPOLLIN。
5、客戶端異常關(guān)閉。
客戶端異常關(guān)閉,并不會(huì)通知服務(wù)器。正常關(guān)閉時(shí) read 返回 0 ,異常斷開(kāi)時(shí)檢測(cè)不到的。服務(wù)器再給一個(gè)已經(jīng)關(guān)閉的socket寫數(shù)據(jù)時(shí),會(huì)出錯(cuò),這時(shí)候,服務(wù)器才明白對(duì)方可能已經(jīng)異常斷開(kāi)了(讀也可以)。
Epoll中就是向已經(jīng)斷開(kāi)的 socket 寫或者讀,會(huì)發(fā)生 EPOLLERR,即表明已經(jīng)斷開(kāi)。
6、補(bǔ)充 EPOLLERR
當(dāng)客戶端的機(jī)器在發(fā)送“請(qǐng)求”前,就崩潰了(或者網(wǎng)絡(luò)斷掉了),則服務(wù)器一端是無(wú)從知曉的。按照你現(xiàn)在的這個(gè)“請(qǐng)求響應(yīng)方式”,無(wú)論是否使用 epoll,都必須要做超時(shí)檢查。因此,這個(gè)問(wèn)題與 epoll 無(wú)關(guān)。EPOLLERR 這種錯(cuò)誤必須是有動(dòng)作才能檢測(cè)出來(lái)。服務(wù)器不可能經(jīng)常的向客戶端寫一個(gè)東西,所以不能依照有沒(méi)有 EPOLLERR 來(lái)判斷客戶端是不是死了。因此,服務(wù)器中的超時(shí)檢查是很重要的,這也是以前服務(wù)器中作死后確認(rèn)的原因。
!!!服務(wù)器 中的超時(shí)檢查!!!很重要。
?
(SAW:Game Over!)
總結(jié)
以上是生活随笔為你收集整理的OS / Linux / epoll 各种事件解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C/Cpp / STL / 类型萃取
- 下一篇: Linux / TCPIP / 判断 c