![为什么select系统调用中需要加1?](https://linux22.com/image/205501/%E4%B8%BA%E4%BB%80%E4%B9%88select%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%E4%B8%AD%E9%9C%80%E8%A6%81%E5%8A%A01%EF%BC%9F.png)
从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);
相似但不一样的主题:
答案1
论点nfds
为select
指定如下:
这国家食品药品监督管理局参数指定要测试的描述符的范围。首先国家食品药品监督管理局应检查每组描述符;也就是说,描述符从零到国家食品药品监督管理局应检查描述符集中的-1。
换句话说,nfds
给出文件描述符的计数,它本身不是文件描述符。它的最小意义值是 1,而不是 0(从技术上讲,nfds
可以是 0;select
在这种情况下不会执行任何操作,并且可能根本不会被调用,除非您对它的副作用之一感兴趣,例如等待暂停)。
该nfds
值指定多少调用者想要观看的文件描述符;由于文件描述符从 0 开始,如果nfds
是n,文件描述符从0到n–1会被考虑。