我正在读一本关于 C 语言网络编程的书。这是 2004 年的。 在示例代码中,作者使用 select C 函数接受来自客户端的多个连接。该功能今天已弃用吗?
我发现有不同的方式来接受多路复用 I/O,例如 poll 和 epoll。有什么优点?
它并没有被弃用,并且很多程序都依赖它。
它只是不是最好的工具,因为它有一些限制:
select
操作它时重新初始化。如果这些与您无关,请随意使用它。否则,如果您正在寻找跨平台解决方案,请使用
poll
/libevent,或者在某些极少数情况下使用 epoll
/kqueue
来获取特定于平台的优化解决方案。
它的行为并未被弃用,但其设计可能存在性能问题。例如,linux epoll()文档指出:
API 可以用作边沿触发或电平触发接口 面对并很好地扩展到大量监视的文件描述符。
由于有效的替代方案特定于每个操作系统,因此比直接使用 select() 更好的选择是使用跨平台复用库(它使用可用的最佳实现),示例是:
如果您正在针对特定操作系统进行开发,请使用高性能应用程序的推荐实现。
但是,由于有些人不喜欢当前的 I/O 多路复用库(因为“丑陋”),select 仍然是一个可行的替代方案。
这取决于您所说的“已弃用”的含义。
select
的 glibc 手册页顶部有以下内容:
警告:
只能监视小于select()
(1024) 的文件描述符数量(对于许多现代应用程序来说这是一个不合理的下限),并且此限制不会改变。 所有现代应用程序都应使用FD_SETSIZE
或poll
,它们不受此限制。epoll
当您的文档以不要使用某个函数的警告开始时,我认为将该函数称为“已弃用”是公平的。然而,有时该术语意味着某个功能将在不久的将来被删除,而
select
肯定不会被删除。