我是套接字的新手,我正在学习/阅读一些epoll材料和代码。我的问题是,当epoll在系统(Linux)中可用时,epoll可以完全取代select / poll吗?
我认为套接字编程也应该在实践中遵循一些范例。当我阅读代码时,我发现一些“选择”带有“epoll”:
服务器代码在处理阻塞套接字时使用select。我认为epoll(LT)的行为与select相同,所以可以使用epoll替换所有选择。
一些遗留代码使用epoll进行监控。事件返回后,select在相应的fd上用于在读/写之前“检查”它。我不太确定这个“选择”的含义。
我对这些“选择”代码感到困惑,并希望有人可以提供帮助。
答案 0 :(得分:5)
是
Select,Poll和epoll都针对相同的需求:要等到描述符准备好进行读取或写入,那么可以处理描述符(从中读取或写入)。
epoll是一个相对较新的实现,特定于Linux OS(因此,不可移植)。它的优点是只返回挂起的描述符而不需要传递所有描述符并检查哪一个导致系统调用返回。 在许多情况下,epoll比选择或民意调查更快。将epoll与select声音混合使用就像遗留的代码一样,在不重构旧代码的情况下进行修补。 epoll将以更清洁,更快速的方式实现选择(在大多数情况下),正如您所提到的,它可以在两种模式(边缘或级别)中的一种模式下工作。
有一些复杂的实例,epoll描述符可能嵌套在另一个epoll中,实现了一种层次结构,但我认为它很少见,我个人从未见过它的代码实现。