socket编程:多路复用在水平模式监听写事件(腾讯面试题)

针对腾讯后台开发面试题,讨论了在Linux使用select或epoll(LT模式)时,如何处理socket持续报告可写事件的问题。文章指出,在不需要写操作时,不应将描述符放入监听队列,而应在需要时调用write/send。如果遇到写缓冲区满导致EAGAIN错误,应将描述符加入写监听集合,写完后移除。提供了select的测试代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

腾讯后台开发的面试题:
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系统调用更多的返回值处理参见:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老王不让用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值