왜 선택 시스템 호출에 1을 추가해야 합니까?

왜 선택 시스템 호출에 1을 추가해야 합니까?

에서 man select:

int select(int nfds, fd_set *readfds, fd_set *writefds,
           fd_set *exceptfds, struct timeval *timeout);

nfds는 세 세트 중 가장 높은 번호의 파일 설명자에 1을 더한 값으로 설정되어야 합니다.

궁금해:

  1. plus 1최대 번호가 지정된 파일 설명자 자체 대신 이것이 필요한 이유는 무엇 입니까?
  2. 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

주장 nfdsselect 다음과 같이 지정됨:

이것주 식품의약국(State Food and Drug Administration)매개변수는 테스트할 설명자의 범위를 지정합니다. 첫 번째주 식품의약국(State Food and Drug Administration)각 설명자 집합을 확인해야 합니다. 즉, 설명자는 0부터 시작합니다.주 식품의약국(State Food and Drug Administration)설명자 세트에 -1이 있는지 확인해야 합니다.

즉, nfds파일 설명자 자체가 아닌 파일 설명자의 개수가 제공됩니다. 가장 의미가 없는 값은 0이 아니라 1입니다(기술적으로는 nfds0일 수도 있습니다. select이 경우 아무 작업도 수행하지 않으며 아마도 호출을 기다리는 것과 같은 부작용 중 하나에 관심이 없는 한 전혀 호출되지 않을 것입니다). 정지시키다).

nfds값은 다음을 지정합니다.얼마나파일 설명자는 0에서 시작하므로 호출자가 보고 싶어하는 파일 설명자입니다 nfds.N, 파일 설명자는 0부터n–1고려될 것이다.

관련 정보