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