BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #99636同步于 2019/12/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

epoll中的et模式为什么要设为非阻塞呢

toocold2333
2019/12/1镜像同步9 回复
实在愚笨,没想清楚
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Tengteng0903机器人#1 · 2019/12/1
阻塞非阻塞都可以啊
djkaesl机器人#2 · 2019/12/1
https://blog.csdn.net/ldw662523/article/details/79912070
djkaesl机器人#3 · 2019/12/1
et模式需要一直read,如果是非阻塞模式,那么最后一次读会阻塞进内核,这样epoll就不起作用啦
toocold2333机器人#4 · 2019/12/1
意思是一次epoll wait后要对同一个fd进行多次read吗 【 在 djkaesl (my name is 秦艾德) 的大作中提到: 】 : et模式需要一直read,如果是非阻塞模式,那么最后一次读会阻塞进内核,这样epoll就不起作用啦
djkaesl机器人#5 · 2019/12/1
是的,一次有可能接收不完,如果回包很长,假如是2k,而你的缓冲区不够大,假如是1k,那么就需要读取两次才能读完,在ET+非阻塞fd模式下这种情况实际需要读三次,最后一次会返回错误,有个errno告诉应用程序已经读完了。LT模式一次读不完那么下一次还会通过epoll返回有数据可读,因此收到信号后没必要一次读多次,而ET模式,你读不完那么之后也不通知了,所以必须一直读,直到拿到错误码告知数据已经读取完。如果是阻塞模式,最后一次肯定会阻塞到内核,这会造成epoll中的别的fd无法及时得到处理。 【 在 toocold2333 的大作中提到: 】 : 意思是一次epoll wait后要对同一个fd进行多次read吗
toocold2333机器人#6 · 2019/12/1
谢谢大佬
FromMars机器人#7 · 2019/12/3
为何“ 如果是非阻塞模式,最后一次肯定会阻塞到内核,这会造成epoll中的别的fd无法及时得到处理。”? 应该阻塞模式最后一次才会阻塞吧 【 在 djkaesl 的大作中提到: 】 : 是的,一次有可能接收不完,如果回包很长,假如是2k,而你的缓冲区不够大,假如是1k,那么就需要读取两次才能读完,在ET+非阻塞fd模式下这种情况实际需要读三次,最后一次会返回错误,有个errno告诉应用程序已经读完了。LT模式一次读不完那么下一次还会通过epoll返回有数据可读,因此收到信号后没必要一次读多次,而ET模式,你读不完那么之后也不通知了,所以必须一直读,直到拿到错误码告知数据已经读取完。如果是非阻塞模式,最后一次肯定会阻塞到内核,这会造成epoll中的别的fd无法及时得到处理。
adsl123gg机器人#8 · 2019/12/3
自己的理解:对于LT,只要fd可读(有数据即可)或可写,就会返回fd,由程序读写,对于ET,只有fd可读(原来没有数据,然后来了数据)或者可写,才会返回fd,如果本次数据没读完,那么下次就不会返回fd了,那程序就读不了剩下的数据,所以一定要非阻塞。
djkaesl机器人#9 · 2019/12/3
是我笔误,已经修正了 【 在 FromMars 的大作中提到: 】 : 为何“ 如果是非阻塞模式,最后一次肯定会阻塞到内核,这会造成epoll中的别的fd无法及时得到处理。”? : 应该阻塞模式最后一次才会阻塞吧