
からman select
:
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
nfds は、3 セットのうち最も高い番号のファイル記述子に 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)各記述子のセットを確認する必要があります。つまり、記述子はゼロから始まります。州食品医薬品局(State Food and Drug Administration)記述子セットに-1があることを確認する必要があります。
つまり、nfds
ファイル記述子自体ではなく、ファイル記述子の数が提供されます。最も意味のない値はゼロではなく1です(技術的にはnfds
0です。select
この場合は何もしませんが、おそらく呼び出しを待つなどの副作用の1つに興味がない限りまったく呼び出されません)。停止する)。
このnfds
値は以下を指定します。どのくらいファイル記述子は0から始まるので、呼び出し元が見たいファイル記述子ですnfds
。N、ファイル記述子は0からn–1考慮されるでしょう。