将epoll_event.events置0是否可禁用事件(类kqueue的EV_DISABLE)?
epoll_events字段置零能否禁用事件?
是的,将epoll_event.events字段的位清零后,通过EPOLL_CTL_MOD修改监控配置,确实会让对应的文件描述符不再被epoll_wait报告任何事件,效果和kqueue的EV_DISABLE选项类似,但底层实现有细微区别:
- kqueue的
EV_DISABLE是标记事件条目为禁用状态,底层的事件过滤器仍然在运行,只是不会把该事件返回给用户; - 而epoll这边,当
events设为0时,相当于告知epoll停止监控该文件描述符的所有事件类型,epoll会终止对该fd的相关事件检测,直到你再次通过EPOLL_CTL_MOD设置有效的事件位。
针对给出的代码示例分析
epoll_event ev; ev.data.fd = 0; /* stdin file descriptor */ ev.events = EPOLLIN; epoll_ctl(epollfd, EPOLL_CTL_ADD, evfd, &ev); ev.events = 0; epoll_ctl(epollfd, EPOLL_CTL_MOD, evfd, &ev);
这段代码的执行逻辑和效果如下:
- 首先通过
EPOLL_CTL_ADD将标准输入(fd=0)添加到epoll实例,配置为监控EPOLLIN事件; - 随后将
ev.events设为0,调用EPOLL_CTL_MOD修改该fd的监控规则; - 完成修改后,
epoll_wait将不再报告该fd的任何事件,直到你重新给events设置有效的事件类型(比如再次设为EPOLLIN并调用EPOLL_CTL_MOD)。
内容的提问来源于stack exchange,提问作者jorge is not ai
相关产品推荐
相关产品推荐

