Linux:select的第一个参数

4
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout);

针对第一个参数nfds,以下是我从维基百科获取的信息:

这个参数是所有集合中文件描述符最大值加一的整数。换句话说,在向每个集合添加文件描述符时,必须计算所有描述符的最大整数值,然后将该值加一,再将其作为nfds参数传递。

我有一个简单的问题:
如果我要处理多个套接字,应该如何设置select的第一个参数?

我应该将它设置为最大套接字号码+1吗?

如果是这样,那么select是否表示正在监听小于最大套接字号码加1的所有文件描述符?

例如,我有三个套接字:111、222和333。如果我将第一个参数设置为334,那么这是否意味着我正在监听0到333之间的所有文件描述符?


似乎是旧帖的复制: http://unix.stackexchange.com/questions/7742/whats-the-purpose-of-the-first-argument-to-select-system-call - eyalm
1个回答

2

我应该将它设置为最大套接字号码加1吗?

是的!

如果是这样,那么它是否意味着select正在监听所有小于最大套接字号码+1的文件描述符?

不,它只在readfds、writefds和exceptfds中列出的fd_sets上执行操作。

例如,我有三个套接字:111、222和333。如果我将第一个参数设置为334,这是否意味着我正在监听从0到333的所有文件描述符?

不,您只对111、222和333进行$select$操作。

在内部,sys_select设置了3个位图,每个位集都将一个位设置为1,表示其中的三个位集之一,然后如果设置了任何这些位(其反过来对应文件描述符操作),则对其执行wait_key_set操作。

此接口的原因是,在内核中,它会演变成一个非常可预测的for循环;使其使用起来相当安全;而不是尝试在内核内部进行计算。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接