에서 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
다음과 같이 지정됨:
이것주 식품의약국(State Food and Drug Administration)매개변수는 테스트할 설명자의 범위를 지정합니다. 첫 번째주 식품의약국(State Food and Drug Administration)각 설명자 집합을 확인해야 합니다. 즉, 설명자는 0부터 시작합니다.주 식품의약국(State Food and Drug Administration)설명자 세트에 -1이 있는지 확인해야 합니다.
즉, nfds
파일 설명자 자체가 아닌 파일 설명자의 개수가 제공됩니다. 가장 의미가 없는 값은 0이 아니라 1입니다(기술적으로는 nfds
0일 수도 있습니다. select
이 경우 아무 작업도 수행하지 않으며 아마도 호출을 기다리는 것과 같은 부작용 중 하나에 관심이 없는 한 전혀 호출되지 않을 것입니다). 정지시키다).
이 nfds
값은 다음을 지정합니다.얼마나파일 설명자는 0에서 시작하므로 호출자가 보고 싶어하는 파일 설명자입니다 nfds
.N, 파일 설명자는 0부터n–1고려될 것이다.