究竟是select()函数的第一个参数

mar*_*4rd 4 c unix sockets linux

我不太明白select函数中第一个参数的目的.维基百科将其描述为所有集合中的最大文件描述符,加1.为什么+1以及为什么select需要此信息?

Rem*_*eau 5

在*Nix系统中,文件描述符只是系统表的索引,fd_set结构包含与这些索引对应的位掩码.将描述符添加到a时fd_set,将启用相应的位. select()需要知道最高描述符值,以便它可以遍历这些位并知道哪一个停止.

在Windows上,套接字由内核对象的句柄表示,而不是由索引表示.该fd_set结构包含一个套接字句柄数组和一个数组中套接字数量的计数器.这样,select()可以循环遍历数组,这就是为什么select()在Windows上忽略第一个参数的原因.


Cri*_*ujo 1

这个想法是 select 函数可以使用第一个参数来优化读取 fd_set 的时序。

在手册中:

man select
Run Code Online (Sandbox Code Playgroud)

它说:

nfds 是三个集合中编号最大的文件描述符,再加 1。

因此 select 函数只检查 fd_set 中小于此的 fd,而不检查 fd_set 中所有可能的 fd。该大小在 FD_SETSIZE 常量中定义。