2

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

我认为套接字编程在实践中也应该有一些范式可以遵循。当我阅读代码时,我发现一些带有“epoll”的“select”:

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

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

我对这些“选择”代码感到困惑,希望有人能提供帮助。

4

1 回答 1

5

是的。

Select、Poll 和 epoll 都针对相同的需求:等待描述符准备好进行读取或写入,然后才能处理描述符(读取或写入)。

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

在我看来,使用 epoll 和 select 听起来就像是在没有重构旧代码的情况下修补了遗留代码。epoll 将以一种更干净、更快捷的方式(在大多数情况下)实现 select,并且正如您所提到的,它可以在两种模式之一(边缘或水平)下工作。

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

于 2012-04-12T09:51:49.387 回答