linux – 如果在边缘触发模式下调用epoll_ctl之前文件是可读的,后续的epoll_wait会立即返回吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux – 如果在边缘触发模式下调用epoll_ctl之前文件是可读的,后续的epoll_wait会立即返回吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1709字,纯文字阅读大概需要3分钟。
内容图文
![linux – 如果在边缘触发模式下调用epoll_ctl之前文件是可读的,后续的epoll_wait会立即返回吗?](/upload/InfoBanner/zyjiaocheng/966/950ea0bcbc964af7a4333bd888a7b968.jpg)
epoll是否保证在epoll_ctl为EPOLLIN注册文件后第一次(或正在)调用epoll_wait,并且在epoll_ctl调用之前文件已经可读的情况下,EPOLLET会立即返回?从我对测试程序的实验来看,似乎答案是肯定的.以下是一些澄清我的问题的例子:
假设我们初始化了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中的呼叫立即返回吗?根据我的经验,确实如此.这有保证吗?
现在考虑第二种情况,扩展第一种情况:
> thread1:将数据写入fd
> thread2:epoll_ctl(efd,EPOLL_CTL_ADD,fd,& event);
> thread2:epoll_wait(efd,events,MAXEVENTS,-1);
> thread2:epoll_ctl(efd,EPOLL_CTL_MOD,fd,& event);
> thread2:epoll_wait(efd,events,MAXEVENTS,-1);
第5步中的通话是否立即返回?根据我的经验,确实如此.有保证吗?
epoll手册页在这个问题上并不完全清楚.特别是,手册页建议您在使用边缘触发模式时应始终从文件中读取,直到返回EAGAIN.但似乎这些评论假设您不想在文件等待时重新注册文件.
what is the purpose of epoll’s edge triggered option?是一个相关的讨论.对第一个答案的前两个评论似乎证实我看到的行为是预期的.
https://gist.github.com/3900742是一个C测试程序,它说明带有管道的epoll似乎表现得像我所描述的那样.
解决方法:
由于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);
这样就解释了你所看到的行为,似乎是故意做的.但由于没有规范,因此没有铸铁保证未来行为不会改变.
内容总结
以上是互联网集市为您收集整理的linux – 如果在边缘触发模式下调用epoll_ctl之前文件是可读的,后续的epoll_wait会立即返回吗?全部内容,希望文章能够帮你解决linux – 如果在边缘触发模式下调用epoll_ctl之前文件是可读的,后续的epoll_wait会立即返回吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。