C select() 函数是否已弃用?

问题描述 投票:0回答:3

我正在读一本关于 C 语言网络编程的书。这是 2004 年的。 在示例代码中,作者使用 select C 函数接受来自客户端的多个连接。该功能今天已弃用吗?

我发现有不同的方式来接受多路复用 I/O,例如 pollepoll。有什么优点?

c io posix-select
3个回答
8
投票

它并没有被弃用,并且很多程序都依赖它。

它只是不是最好的工具,因为它有一些限制:

  • 文件描述符的数量是有限的(特定于操作系统,通常可以通过内核重新编译来增加它)。
  • 扩展性不好(有很多 fd):必须维护整个 FD 集,并在
    select
    操作它时重新初始化。

如果这些与您无关,请随意使用它。否则,如果您正在寻找跨平台解决方案,请使用

poll
/libevent,或者在某些极少数情况下使用
epoll
/
kqueue
来获取特定于平台的优化解决方案。


4
投票

它的行为并未被弃用,但其设计可能存在性能问题。例如,linux epoll()文档指出:

API 可以用作边沿触发或电平触发接口 面对并很好地扩展到大量监视的文件描述符。

由于有效的替代方案特定于每个操作系统,因此比直接使用 select() 更好的选择是使用跨平台复用库(它使用可用的最佳实现),示例是:

如果您正在针对特定操作系统进行开发,请使用高性能应用程序的推荐实现。

但是,由于有些人不喜欢当前的 I/O 多路复用库(因为“丑陋”),select 仍然是一个可行的替代方案。


0
投票

这取决于您所说的“已弃用”的含义。

select
的 glibc 手册页顶部有以下内容:

警告:

select()
只能监视小于
FD_SETSIZE
(1024) 的文件描述符数量(对于许多现代应用程序来说这是一个不合理的下限),并且此限制不会改变。 所有现代应用程序都应使用
poll
epoll
,它们不受此限制。

当您的文档以不要使用某个函数的警告开始时,我认为将该函数称为“已弃用”是公平的。然而,有时该术语意味着某个功能将在不久的将来被删除,而

select
肯定不会被删除。

© www.soinside.com 2019 - 2024. All rights reserved.