为什么必须使用非阻塞FD在边沿触发epoll的功能?(Why having to use non-b

2019-08-16 16:20发布

我读文件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的功能好吗?

Answer 1:

我们的想法是尝试当你有一个边沿触发通知,有要过数据完全排空的文件描述符。 所以,一旦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()



Answer 2:

我想这是因为边沿触发的语义。 边沿触发,根据语义,将只提出一次EAGAIN已经接收到另一个事件。 在阻止套接字的情况下,没有EAGAIN。 你可以在一些其他的方式定义,但是,这个Linux下如何定义它。 换句话说,如果你使用阻止套接字,你不知道,当你可以安全地调用epoll_wait的想法。



Answer 3:

请您务必阅读,或写上的epoll的ET模式中的所有数据,因为标志更改后等方式触发一次。 当您已经阅读所有的数据,如果您使用的块读取或写入线程必须挂起。 所以,一定要使用该非阻塞。



文章来源: Why having to use non-blocking fd in a edge triggered epoll function?