来自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);
类似的主题但不一样: