来自man select
:
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
nfds 应设置为三个集合中任何一个中编号最高的文件描述符,加 1。
我很好奇:
- 为什么
plus 1
需要,而不是最高编号的文件描述符本身? - 为什么在用户输入中请求
plus 1
操作,而不是在系统内部处理呢?
从sys_generic.c
,它似乎相关__NFDBITS
,但我无法更进一步。
static int max_select_fd(unsigned long n, fd_set_bits *fds)
339{
340 unsigned long *open_fds;
341 unsigned long set;
342 int max;
343 struct fdtable *fdt;
344
345 /* handle last in-complete long-word first */
346 set = ~(~0UL << (n & (__NFDBITS-1)));
347 n /= __NFDBITS;
348 fdt = files_fdtable(current->files);
349 open_fds = fdt->open_fds->fds_bits+n;
350 max = 0;
351 if (set) {
352 set &= BITS(fds, n);
353 if (set) {
354 if (!(set & ~*open_fds))
355 goto get_max;
356 return -EBADF;
357 }
358 }
359 while (n) {
360 open_fds--;
361 n--;
362 set = BITS(fds, n);
类似的主题但不一样:
to的
nfds
参数select
指定如下:换句话说,
nfds
给出文件描述符的计数,它本身不是文件描述符。它的最小意义值是 1,而不是 0(从技术上讲,nfds
可以是 0;select
在这种情况下什么都不做,也可能根本不被调用,除非你对它的副作用之一感兴趣,例如等待暂停)。该
nfds
值指定调用者想要查看多少个文件描述符;由于文件描述符从 0 开始,如果nfds
是n ,则将考虑从 0 到n–1 的文件描述符。