epoll的再次认识
這 點(diǎn)實(shí)際上涉及到epoll的具體實(shí)現(xiàn)了。無(wú)論是select,poll還是epoll都需要內(nèi)核把FD消息通知給用戶空間,如何避免不必要的內(nèi)存拷貝就很 重要,在這點(diǎn)上,epoll是通過(guò)內(nèi)核于用戶空間mmap同一塊內(nèi)存實(shí)現(xiàn)的。而如果你想我一樣從2.5內(nèi)核就關(guān)注epoll的話,一定不會(huì)忘記手工 mmap這一步的。
順便看一下 EPOLLET 和 EPOLLLT
EPOLLLT 是默認(rèn)行為,基本上就是說(shuō),只要一個(gè)文件描述符處于就緒狀態(tài),epoll 就會(huì)不停的通知你有事件發(fā)生。傳統(tǒng)的 select/poll 都是這樣的
EPOLLET 是新的方式,只在一個(gè)文件描述符新處于就緒的時(shí)候通知一次,之后不管數(shù)據(jù)有沒(méi)有讀完,都不會(huì)再通知,當(dāng)然,有新數(shù)據(jù)到還是會(huì)通知的。所以,用 EPOLLET 的時(shí)候,一定要把文件描述符設(shè)置為 non-blocking,而且最好是一直讀數(shù)據(jù),讀到返回 EAGAIN 才停下
EPOLLOUT事件:
EPOLLOUT事件只有在連接時(shí)觸發(fā)一次,表示可寫,其他時(shí)候想要觸發(fā),那要先準(zhǔn)備好下面條件:
1.某次write,寫滿了發(fā)送緩沖區(qū),返回錯(cuò)誤碼為EAGAIN。
2.對(duì)端讀取了一些數(shù)據(jù),又重新可寫了,此時(shí)會(huì)觸發(fā)EPOLLOUT。
簡(jiǎn)單地說(shuō):EPOLLOUT事件只有在不可寫到可寫的轉(zhuǎn)變時(shí)刻,才會(huì)觸發(fā)一次,所以叫邊緣觸發(fā),這叫法沒(méi)錯(cuò)的!
其實(shí),如果真的想強(qiáng)制觸發(fā)一次,也是有辦法的,直接調(diào)用epoll_ctl重新設(shè)置一下event就可以了,event跟原來(lái)的設(shè)
總結(jié)
以上是生活随笔為你收集整理的epoll的再次认识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++(STL):24 ---序列式容器
- 下一篇: APK 安卓反编译