当epoll可用时,epoll会完全取代select/poll吗?

xgw*_*ang 2 sockets linux select epoll

我是插座的新手,我正在学习/阅读一些epoll材料和代码.我的问题是,当epoll在系统(Linux)中可用时,epoll可以完全取代select/poll吗?

我认为套接字编程也应该有一些在实践中遵循的范例.当我阅读代码时,我发现一些"选择"带有"epoll":

  1. 服务器代码在处理阻塞套接字时使用select.我认为epoll(LT)的行为与select相同,所以可以使用epoll替换所有select.

  2. 一些遗留代码使用epoll进行监控.事件返回后,select在相应的fd上用于在读/写之前"检查"它.我不太确定这个"选择"的含义.

我对这些"选择"代码感到困惑,希望有人可以提供帮助.

Edw*_*rdH 5

是.

Select,Poll和epoll都针对相同的需求:要等到描述符准备好进行读取或写入,那么可以处理描述符(从中读取或写入它).

epoll是一个相对较新的实现,特定于Linux OS(因此,不可移植).它的优点是只返回挂起的描述符,而不需要传递所有描述符并检查哪一个导致系统调用返回.在许多情况下,epoll比select或poll更快.

将epoll与select声音混合使用就像遗留的代码一样,在没有重构旧代码的情况下进行修补.epoll将以更清洁,更快速的方式实现选择(在大多数情况下),正如您所提到的,可以在两种模式(边缘或级别)中的一种模式下工作.

有一些复杂的实例,epoll描述符可能嵌套在另一个epoll中,实现了一种层次结构,但我认为很少见,我个人从未见过它的代码实现.