带有边缘触发和单触发的Epoll仅报告一次
我目前正在将一个从
accept创建的sockfds添加到epoll实例中,其中包含以下事件:
const int EVENTS = ( EPOLLET | EPOLLIN | EPOLLRDHUP | EPOLLONESHOT | EPOLLERR | EPOLLHUP); 触发事件后,我将其传递给处理程序线程,读取然后通过epoll_ctl使用相同的标志重新启用sockfd.但是,我只收到一次EPOLLIN事件.此外,如果我在收到第一个事件后随时杀死客户端,我也不会收到挂断事件.通过阅读手册页,我认为我理解了EdgeTriggered和OneShot的正确方法. 下面是我正在使用的进程的一些伪代码: const int EVENTS = ( EPOLLET | EPOLLIN | EPOLLRDHUP | EPOLLONESHOT | EPOLLERR | EPOLLHUP); void event_loop() { struct epoll_event event; struct epoll_event *events; events = calloc(100,sizeof event); while (1) { int x; int num_events = epoll_wait(epfd,events,100,-1); for (x = 0; x < num_events; x++) { another_thread(fd); } } } void another_thread(int fd) { // Read stuff until EAGAIN struct epoll_event event; event.data.fd = fd; event.events = EVENTS; epoll_ctl(epfd,EPOLL_CTL_MOD,fd,&event); } 当我执行EPOLL_CTL_MOD操作时,我没有收到任何错误,但从未收到其他事件的通知.如果我在第一个事件之后重复读取循环,它将读取客户端发送的所有后续数据,因此我知道数据进入并且fd仍然打开并正常工作. 从检查strace开始,线程从clone创建并具有标志CLONE_FILES,因此所有线程共享相同的fd表. 从单独的线程重新启用读取事件的fd的正确方法是什么? 解决方法
epoll_ctl(2)的手册页说:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- cocos2dx3.3开发FlappyBird总结十:背景层设计
- ruby-on-rails – 停止记录ActionController :: RoutingErr
- 【全栈React】第24天: 测试应用
- 正则表达式 – Perl,sed或awk one-liner来改变文件的格式
- ruby-on-rails – 如何在Ruby on Rails中下载CSV文件?
- Ajax保留浏览器历史的两种解决方案(Hash&Pjax)
- PostgreSQL的内存管理机制三:AllocSet/MemoryContext实例删
- 使用XML包将TCX导入R中
- webpack入门及结合react进行开发
- typescript + echarts-for-react 制作渐变柱状图, 提示[ts