epoll_oneshot
时间: 2023-08-21 08:04:11 浏览: 44
EPOLLONESHOT事件是在使用epoll机制时可以注册的一个事件选项,用来限制一个socket连接在任一时刻只能被一个线程处理。当一个socket上注册了EPOLLONESHOT事件后,操作系统最多触发其上注册的一个事件,并且只触发一次。除非使用epoll_ctl函数重新设置该socket上的EPOLLONESHOT事件。
通过EPOLLONESHOT事件的设置,可以确保在一个线程使用socket时,其他线程无法操作该socket。只有在该socket被处理完毕后,需要立即重置该socket的EPOLLONESHOT事件,以确保在下次该socket可读时,对应的EPOLLIN事件能够被触发,并让其他线程有机会操作该socket。
在工作线程函数中,如果一个线程处理完一个socket上的一次请求后,又接收到该socket上的新的客户请求,则该线程将继续为该socket服务。由于该socket上注册了EPOLLONESHOT事件,其他线程将无法接触该socket。如果工作线程处理一段时间后仍然没有收到该socket上的下一批客户数据,则该线程将放弃为该socket服务,并调用reset_oneshot函数来重置该socket上的注册事件。这样,epoll可以再次检测到该socket上的EPOLLIN事件,从而使其他线程有机会为该socket服务。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [I/O复用之 EPOLLONESHOT 事件](https://blog.csdn.net/liushall/article/details/79248879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *2* [Linux编程入门三网络编程三 epoll的LT和ET模式以及EPOLLONESHOT事件](https://blog.csdn.net/asmartkiller/article/details/90076585)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *3* [Android8.1 init进程学习](https://download.csdn.net/download/snail201211/10217324)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
[ .reference_list ]