linux epoll 非阻塞,linux – 为什么必须在边缘触发的epoll函数中使用非阻塞fd?

我在网上读了文件abount edge触发的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)接口的建议方法如下:

i)使用非阻塞文件描述符

ii)只有在读取(2)或写入(2)返回EAGAIN后才为事件调用epoll_wait.

我理解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()之间进入,则有可能会错过新数据.

标签:epoll,linux,socket-io,nonblocking

来源: https://codeday.me/bug/20190901/1782111.html

你可能感兴趣的:(linux,epoll,非阻塞)