【问题标题】:Is C select() function deprecated?C select() 函数是否已弃用?
【发布时间】:2013-09-19 16:33:58
【问题描述】:

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

我发现接受多路 I/O 的方式有很多种,例如 pollepoll。有什么优势?

【问题讨论】:

  • 是什么让您认为 select() 已被弃用?它仍然在最新的 POSIX 规范中定义。
  • 我也想知道。 linux下的select仅限于监控前1024个文件描述符,即使只有一个描述符要监控等于或大于1024也确实会出错。由于线程使用文件描述符在所有线程之间共享,那么什么是专用的现在为同一进程中的所有线程累积处理。将 select 与需要处理超过 1024 个连接的程序一起使用需要使用分叉进程而不是使用线程。

标签: c io posix-select


【解决方案1】:

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

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

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

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

【讨论】:

  • 许多程序依赖某些东西的事实并不意味着它永远不会被弃用。这意味着它不太可能被删除。弃用只是意味着建议避免某些事情。推荐应避免的东西与许多程序依赖它之间没有矛盾。
  • @EricPostpischil:你能说出过去 10 年中被弃用的 C 语言中的 anything 吗?
  • 那是不合逻辑的。我不争论select 是否会被弃用。我不同意“许多依赖它的程序”意味着某些东西永远不会被弃用的暗示。
  • 是的,你说得对,但我猜 OP 担心被弃用意味着它在某一时刻将不再支持。我试图参考这种弃用过程。
  • @KarolyHorvath 参见 linux 下的 gethostbyname man:gethostbyname*()、gethostbyaddr*()、herror() 和 hstrerror() 函数已过时。应用程序应该使用 getaddrinfo(3)、getname-info(3) 和 gai_strerror(3)。但我不知道它何时被弃用(是否在 2004 年之前......)。
【解决方案2】:

它的行为并没有被弃用,但它的设计可能存在性能问题。例如,linux epoll() documentation 表示:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 2023-03-08
    • 2018-09-12
    相关资源
    最近更新 更多