我读文件abount缘网络触发epoll的功能如下:
1. The file descriptor that represents the read side of a pipe (rfd) is registered on the epoll instance.
2. A pipe writer writes 2 kB of data on the write side of the pipe.
3. A call to epoll_wait(2) is done that will return rfd as a ready file descriptor.
4. The pipe reader reads 1 kB of data from rfd.
5. A call to epoll_wait(2) is done.
.......
.......
epoll的使用作为一个边沿触发(EPOLLET)接口建议的方法如下:1)使用非阻塞文件描述符ii)传召epoll_wait为只读(2)或write(2)返回EAGAIN后的事件。
我明白了2,但我不知道为什么非阻塞文件描述符被使用。
任何人都可以解释为什么使用非阻塞文件描述符的原因是什么? 为什么使用阻塞文件描述符的电平触发epoll的功能好吗?
我们的想法是尝试当你有一个边沿触发通知,有要过数据完全排空的文件描述符。 所以,一旦epoll()
返回时,你遍历所有的read()
或write()
,直到它返回-EAGAIN
时,有没有更多的数据了。
如果FD被打开阻塞,则最后read()
或write()
也将阻塞,你就不必回去的机会epoll()
调用等待整个组FDS的。 当打开非阻塞,最后read()
/ write()
不返回,和你有要回去投票的机会。
使用时,这与其说是关注epoll()
在电平触发的方式,因为在这种情况下epoll()
将立即返回,如果存在要过任何数据。 因此,一个(伪)循环,例如:
while (1) {
epoll();
do_read_write();
}
会工作,因为你保证调用do_read_write()
只要有数据。 当使用边沿触发epoll的,有一个新的数据可错过的,如果它的终点之间来通知潜在do_read_write()
并在下次调用epoll()
我想这是因为边沿触发的语义。 边沿触发,根据语义,将只提出一次EAGAIN已经接收到另一个事件。 在阻止套接字的情况下,没有EAGAIN。 你可以在一些其他的方式定义,但是,这个Linux下如何定义它。 换句话说,如果你使用阻止套接字,你不知道,当你可以安全地调用epoll_wait的想法。
请您务必阅读,或写上的epoll的ET模式中的所有数据,因为标志更改后等方式触发一次。 当您已经阅读所有的数据,如果您使用的块读取或写入线程必须挂起。 所以,一定要使用该非阻塞。