在*Nix系统中,文件描述符只是系统表的索引,fd_set结构包含与这些索引对应的位掩码.将描述符添加到a时fd_set,将启用相应的位. select()需要知道最高描述符值,以便它可以遍历这些位并知道哪一个停止.
在Windows上,套接字由内核对象的句柄表示,而不是由索引表示.该fd_set结构包含一个套接字句柄数组和一个数组中套接字数量的计数器.这样,select()可以循环遍历数组,这就是为什么select()在Windows上忽略第一个参数的原因.
这个想法是 select 函数可以使用第一个参数来优化读取 fd_set 的时序。
在手册中:
man select
Run Code Online (Sandbox Code Playgroud)
它说:
nfds 是三个集合中编号最大的文件描述符,再加 1。
因此 select 函数只检查 fd_set 中小于此的 fd,而不检查 fd_set 中所有可能的 fd。该大小在 FD_SETSIZE 常量中定义。