代码之家  ›  专栏  ›  技术社区  ›  Brian

当nfds大于fd_集合中位数组的长度时,select做什么?有可能吗?

  •  1
  • Brian  · 技术社区  · 6 年前
    int select(int nfds, 
           fd_set *readfds, 
           fd_set *writefds, 
           fd_set *exceptfds, 
           struct timeval *timeout);
    

    给定fd_集的长度为1024。如果我们要监控的FD是2048呢?发生这种情况时,select做什么?会发生吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   gone    6 年前

    根据 the specification 如果 nfds 大于 FD_SETSIZE , select() 将返回-1并设置 errno 使兴奋。

    在某些实现中(包括在Linux系统上),它将写入 fd_set 结构,可能损坏应用程序中的内存。(目的是允许应用程序使用更大的 FDSSET 结构,但其效果往往是,一旦应用程序尝试使用1024个以上的文件描述符,就会导致它们崩溃。)

    要使用1024个以上的文件描述符,需要使用除 选择() . 这些api通常是特定于系统的;需要考虑的一个独立于平台的选项是 libev 库,它为高度并发的应用程序提供了一组有用的抽象。