Кажется, я помню, что это всего лишь битовая маска. Массив символов (или некоторого другого базового типа), где каждый бит символа представляет состояние каждого дескриптора файла.
Некоторые реализации также имеют переменную предела, если они допускают структуры переменного размера, но большинство из того, что я видел (и это, как правило, старые), просто допускают наибольшее количество файловых дескрипторов.
Однако реализация может свободно использовать любую структуру данных, какую пожелает, при условии, что она предоставляет макросы или функции FD_ * для их правильной инициализации и изменения.