В OS X мы обнаруживаем, что вызовы :: socket (...) могут иногда возвращать дескриптор файла, который больше, чем FD_SETSIZE.Согласно документации для :: socket (...) это успешный запрос, так как только возвращаемые значения -1 указывают на сбой.Тем не менее, во всей нашей кодовой базе - перед использованием дескриптора - мы проверяем, что он находится в диапазоне от 0 до FD_SETSIZE включительно.
Это правильная вещь, или мы можем безопасно пойти дальше и использовать сокетычьи дескрипторы больше, чем FD_SETSIZE?
Причина, по которой это происходит, заключается в том, что мы вызываем :: setrlimit (...) с флагом RLIMIT_NOFILE для увеличения максимального числа дескрипторов файлов.Мы должны сделать это, потому что наше приложение должно держать большое количество открытых файлов одновременно.Однако это значение получается с помощью вызова sysctl (...) с флагом KERN_MAXFILESPERPROC и устанавливается во время выполнения, тогда как FD_SETSIZE является параметром времени компиляции.