套接字编程中 select() 中的 "nfds" 参数

"nfds" parameter in select() in sockets programming

我从来没有真正理解这个参数背后的想法,它有什么用?我还注意到这个参数在 WinSock2 中被忽略了,这是为什么? Unix 系统使用这个参数还是忽略它?

Windows' select() 的实现在内部使用链表,因此它不需要为任何事情使用 nfds 参数。

然而,在其他 OS 上,实现 fd_set 结构以保存位数组(每个套接字一位)。例如,下面是它在 MacOS/X:

下的声明方式(在 sys/_types/_fd_def.h 中)
typedef struct fd_set {
    __int32_t fds_bits[__DARWIN_howmany(__DARWIN_FD_SETSIZE, __DARWIN_NFDBITS)];
} fd_set;

... 为了做正确的事情,select() 调用必须遍历数组中的位以查看它们包含的内容。通过为 select() 提供 nfds 参数,我们告诉 select() 实现它只需要迭代数组的前 (nfds) 位,而不是总是有在每次调用时遍历整个数组。这使得 select() 比其他方式更有效。