なぜ選択システムコールに1を追加するのですか?

なぜ選択システムコールに1を追加するのですか?

からman select

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

nfds は、3 セットのうち最も高い番号のファイル記述子に 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)各記述子のセットを確認する必要があります。つまり、記述子はゼロから始まります。州食品医薬品局(State Food and Drug Administration)記述子セットに-1があることを確認する必要があります。

つまり、nfdsファイル記述子自体ではなく、ファイル記述子の数が提供されます。最も意味のない値はゼロではなく1です(技術的にはnfds0です。selectこの場合は何もしませんが、おそらく呼び出しを待つなどの副作用の1つに興味がない限りまったく呼び出されません)。停止する)。

このnfds値は以下を指定します。どのくらいファイル記述子は0から始まるので、呼び出し元が見たいファイル記述子ですnfdsN、ファイル記述子は0からn–1考慮されるでしょう。

おすすめ記事