4

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

我看到有不同的方式来接受多路复用 I/O,比如pollepoll。有什么优势?

4

2 回答 2

8

它没有被弃用,许多程序都依赖它。

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

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

如果这些与您无关,请随意使用它。否则poll,如果您正在寻找跨平台解决方案,或者在极少数情况下epoll/kqueue用于特定于平台的优化解决方案,请使用 /libevent。

于 2013-09-15T12:51:07.723 回答
4

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

API 既可以用作边缘触发接口,也可以用作电平触发接口,并且可以很好地扩展到大量监视的文件描述符。

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

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

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

于 2013-09-15T13:15:01.813 回答