Не проверяется от 0 до nfds
-1. Первый аргумент предоставляет только верхнюю границу того, насколько численно используются файловые дескрипторы. Это потому, что сам набор может быть представлен как битовый вектор, без возможности узнать, сколько битов фактически используется. Указание этого в качестве отдельного аргумента помогает select()
избежать проверки файловых дескрипторов, которые не используются.
Кроме того, дескриптор, который отсутствует, например, набор чтения при вызове select()
вообще не проверяется, поэтому он не может появиться в наборе при возврате вызова.