int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout);
对于第一个参数
nfds
,这是我从Wiki获得的信息:我有一个简单的问题:
如果要处理多个套接字,应如何设置
select
的第一个参数?我应该将其设置为最大的插槽号+ 1吗?
如果是这样,是否意味着
select
正在侦听小于最大套接字号+ 1的所有文件描述符?例如,我有三个套接字:111、222和333。如果将第一个参数设置为334,是否表示我正在侦听从0到333的所有文件描述符?
最佳答案
是!
不,它仅对列出的fd_sets执行操作
readfds,writefds和exceptfds
不,您只在111、222和333上执行$ select $。
在内部sys_select设置3个位图,将这三个位集的每个位都设置为1,然后如果设置了这些位中的任何一个(相应地腐 eclipse 了文件描述符操作),则对其执行wait_key_set
操作。
该接口(interface)的原因是在内核中它演变成一个非常可预测的for循环;使工作非常安全;而不是尝试在内核内部进行计算。