微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果在边缘触发模式下调用epoll_ctl之前文件是可读的,后续的epoll_wait会立即返回吗?

epoll保证epoll_ctl在EPOLLIN和EPOLLET中注册后,第一次(或正在进行的)对epoll_wait的调用是否在epoll_ctl调用之前已经可读的情况下立即返回? 从我的testing程序实验看来,答案是肯定的。 这里有几个例子来澄清我的问题:

假设我们已经初始化了一个epoll文件efd和一个文件fd以及下面的事件定义:

event.data.fd = fd; event.events = EPOLLIN | EPOLLET;

现在考虑这种情况:

thread1:将数据写入fd

thread2: epoll_ctl (efd,EPOLL_CTL_ADD,fd,&event);

thread2: epoll_wait (efd,events,MAXEVENTS,-1);

现在步骤3中的呼叫立即返回吗? 根据我的经验, 这是保证吗?

鉴于任何epoll TCP套接字事件,如果EPOLLRDHUP = 0和EPOLLIN = 1; 是一个后续调用read()/ recv()保证返回一个不等于0的读取大小?

为什么我们需要在poll中调用poll_wait?

如何为套接字或epoll事件分配一个上下文

为什么我要在一个全新的套接字上获得EPOLLHUP事件?

Linux,套接字,非阻塞连接

现在考虑第二种情况,扩展第一种情况:

thread1:将数据写入fd

thread2: epoll_ctl (efd,-1);

thread2: epoll_ctl (efd,EPOLL_CTL_MOD,-1);

步骤5中的呼叫是否立即返回? 根据我的经验, 有保证吗?

epoll手册页在这个问题上并不完全清楚。 尤其是,手册页build议您应该始终从文件中读取,直到使用边缘触发模式时返回EAGAIN。 但是,似乎这些评论是假设你没有重新注册文件,只要你想等待文件

epoll边缘触发选项的目的是什么? 是一个相关的讨论。 前两个对第一个答案的评论似乎证实了我所预期的行为。

https://gist.github.com/3900742是一个Ctesting程序,说明epoll与pipe道似乎performance得像我描述的那样。

epoll文件描述符操作

普通文件上的Epoll

如何检测空的epoll集

EPOLLET的用例是什么?

一个单线程的Nginx如何处理这么多的连接?

由于epoll是Linux专用的,因此没有真正的规范,所以它实际上实现的很多(手册页以更友好的方式尝试描述,但不提供边缘情况的所有细节) 。

查看ep_insert和ep_modify都检查当前事件位(不考虑EPOLLET ):

/* * Get current event bits. We can safely use the file* here because * its usage count has been increased by the caller of this function. */ revents = epi->ffd.file->f_op->poll(epi->ffd.file,&pt);

这就解释了你所看到的行为,似乎是故意的。 但是由于没有规范,没有铸铁的保证,行为将来不会改变。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐