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

C select()函数是否已弃用?,c,io,posix-select,C,Io,Posix Select,我正在读一本关于C语言网络编程的书。这是2004年的。 在示例代码中,作者使用selectC函数接受来自客户端的多个连接。这个函数今天被弃用了吗 我发现有不同的方式来接受多路复用的I/O,比如poll和epoll。它的优点是什么?它没有被弃用,很多程序都依赖它 这不是最好的工具,因为它有一些局限性: 文件描述符的数量是有限的(特定于操作系统,通常可以通过内核重新编译来增加) 不能很好地扩展(有很多FD):必须维护整个FD集,并在select操作它时重新初始化 如果这些与您无关,请随意使用它。

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


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

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

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

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

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

它的行为不受欢迎,但其设计可能存在性能问题。例如,缔约国:

API可用作边缘触发或级别触发的内部 面,并可很好地缩放到大量关注的文件描述符。 由于有效的替代方案针对每个操作系统,因此比直接使用select()更好的选择是使用跨平台多路复用库(使用可用的最佳实现),例如:

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


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

是什么让你认为
select()
不受欢迎?它仍然在最新的POSIX规范中定义。我也在想同样的问题。linux下的select仅限于监视前1024个文件描述符,即使只有一个要监视的描述符等于或大于1024个,它也会出错。由于线程使用情况文件描述符在所有线程之间共享,因此,现在为同一进程中的所有线程累计已分配到进程的内容。在需要处理1024个以上连接的程序中使用select时,则需要使用分叉进程,而不使用线程。许多程序依赖某些东西并不意味着它永远不会被弃用。这意味着它不太可能被移除。不赞成只是指推荐一些应该避免的东西。在推荐一些可以避免的东西和在许多程序中依赖它之间没有不一致之处。@EricPostPhischil:你能从C中举出在过去10年中曾经被弃用过的东西吗?这是一个不合理的结论。我不会争论
select
是否会被弃用。我不同意“很多程序依赖它”意味着某些东西永远不会被弃用。是的,你说得对,但我猜OP担心被弃用意味着它在某一点上不再被支持。我试图引用这种弃用过程。@KarolyHorvath请参阅linux下的gethostbyname man:gethostbyname*()、gethostbyaddr*()、herror()和hstrerror()函数已过时。应用程序应该使用getaddrinfo(3)、getname-info(3)和gai_strerror(3)。但我不知道它是在什么时候被弃用的(是不是在2004年之前…)。