腾讯后台开发的面试题:
Linux 使用 select 或者 epoll模型(LT),当socket可写时,会不停的触发socket可写的事件,如何处理?
解释:LT模式下不需要读写的文件描述符仍会不停地返回就绪,这样就会影响我们监测需要关心的文件描述符的效率(因为我们需要挨个遍历并处理已经就绪的描述符)。对于写事件而言只要写缓冲区不为满(大多数情况也是这样)。那么select、epoll_wait 就会一直返回写就绪状态,此时我们很可能不需要进行写操作即发送数据操作,之后 select、epoll_wait 会一直返回,非常影响效率。
答:通常发送数据操作会分散在程序的各个地方,因此平时不要把该描述符 wr_fd 放进 eventpoll 的监听队列中 或者 select的写服务集合 ,需要写的时候调用 write / send 发送数据,如果写/发送缓冲区已满,即接口返回值为-1,errno值为EAGAIN,此时需要将 wr_fd 放入写监听集合中,当发送完成再将 wr_fd 取消掉;对于epoll动作相同即将 EPOLLOUT(可写事件)从对应的event_fd添加删除。关于 write/send系统调用更多的返回值处理参见: