epoll 总结

1 .
水平触发:

当我们关注的事件为读事件时,只要缓存中有东西可读,那么就触发;当我们关注的事件为写事件时,只要缓存中有东西可写那么就触发。

边沿触发:

当我们关注的事件为读事件时:1.当由不可读变为可读时会触发(即BUFFE由空到非空)。2.当可读的内容变多时(即有新的数据到来)会触发。

当我们关注的事件为写事件时:1.由不可写变为可写时会触发(即BUFFE由满变为非满)。2.当buffer中的内容变少时(旧数据被发送走)会触发。

2. epoll 触发一个读事件的时候,如果这个fd 接收缓冲区一直有数据,也就是这个连接,不停的传输。这个fd的recv 会一直持续下去。
会影响下一个 fd的读,可改成lt模式,同时一个fd最多读取定量数据

3. connect 也有again,可以添加可写事件,在可写事件回调里getsocketopt判断err。然后移除可写,添加可读。
accept 也有again,需要循环accept,返回的fd大于0,处理,小于0,accept到agagin

4. read again,write again需要处理

5. lt 发送数据,需要先直接发送,失败添加事件处理,再有数据发送的话,先判断fd的队列是否为空,不空的话,直接添加队尾,返回。等待可写事件触发,取队首,发送
发送完毕,移除可写事件

6. et模式读数据 要读到again,要不只能等到下次数据触发。不过,有可能出现一种情况,就是当前触发读,是到了接收缓冲区满的状态,等处理这次收到的数据的时候,
缓冲区又从不满到满,再次调用epoll_wait,就不会触发读事件。即便 接收到数据之后,很快处理,切换线程,也有几率会造成这种情况。
(是不是只有在epoll_wait的时候,缓冲区有变化,才会返回)

 

posted @ 2021-11-19 10:29  caopf  阅读(80)  评论(0编辑  收藏  举报