epoll_wait()是中间层,它表示linux内核帮我们做检测——
epoll_wait()工作示意图
一、水平触发模式——LT
- epoll的默认工作模式
- 如果想要验证的话可以把【读缓冲区】
read_buf
改小一些,这样就可以发现epoll_wait()
被调用了很多次——
epoll水平触发模式
- 可以根据
读
来解释- 可以观察
epoll_wait()
的返回次数,重点是【返回次数】和【发送数据的次数】没有任何关系,比如发送了100个byte的数据,但是接收一次只能接收5个byte,那么返回次数会是20次,但是发送数据的次数只有1次。
二、边沿触发模式——ET
本质上是【边沿阻塞触发】,因为fd默认是【阻塞】的,就算为了可以读取完数据,加一个while(recv())
,但是当数据读完的时候,是会阻塞的
——等待新的数据,所以为了解决阻塞问题,我们可以【设置非阻塞FD】。
- 提高epoll_wait()的效率
- 【套接字】默认是
阻塞
的
client给server发数据,发送一次epoll_wait就返回一次,不在乎这一次能不能把数据读完
三、边沿非阻塞模式
- 效率最高
如何设置非阻塞?
- open(),因为open中有flags——将其设置成
O_WDRW | O_NONBLOCK
。 - fcntl(),修改FD的flag属性
int flag = fcntl(fd, F_GETFL);
flag = O_NONBLOCK
fcntl(fd, F_SETFL, flag);
将缓冲区的全部数据都读出
while(recv() > 0) { printf(); }
网友评论