Как минимум 32-битный Solaris имеет ограничение в 256 файловых указателей, потому что структура хранит файловый дескриптор в поле без знака. Это сохраняется для обратной совместимости с некоторыми почти невозможными старыми версиями SunOS. Другие платформы - я испытываю желание сказать, что большинство других платформ - не разделяют это ограничение. С другой стороны, для обычной пользовательской программы относительно редко требуется, чтобы много файлов открывались одновременно; это чаще указывает на ошибку (не закрывая файлы, когда закончил с ними), чем нет. Сказав это, тем не менее, это может быть проблемой для таких вещей, как серверы баз данных, которые должны иметь много открытых файлов данных одновременно.
Один комментарий гласит:
Это почти все. У нас нет большого количества открытых файлов, но сервер обрабатывает большое количество подключений от клиентов. Дескрипторы сокетов и файловые дескрипторы, кажется, происходят из одного места. Когда у нас много соединений, «fopen» завершается ошибкой, потому что системный вызов возвращает и fd> 255.
«Дескрипторы сокетов» - это файловые дескрипторы на уровне системных вызовов, поэтому они приходят из того же места, что и обычные файловые дескрипторы файлов.
Если вам нужно обойти это, вам нужно обернуть текущий код открытия сокета, чтобы, если он получает дескриптор файла в диапазоне 0..255, то он вызывал 'dup2()
' для создания дескриптора файла в диапазоне, который stdio не будет использовать, а затем закройте исходный дескриптор файла. Единственная загвоздка в том, что вы должны отслеживать, какие файловые дескрипторы доступны, потому что dup2
будет радостно закрывать дескриптор целевого файла, если он в данный момент открыт.
Конечно, я предполагаю, что ваш код сокета читает файловые дескрипторы, а не файловые указатели. Если это так, у вас есть большие проблемы - слишком многие люди хотят использовать одни и те же ресурсы, и они не могут использовать их все одновременно.