Есть ли ограничение на количество открытых файлов в Windows

Я открываю много файлов с помощью fopen() в VC++, но через некоторое время это удается.

существует ли ограничение на количество файлов, которые вы можете открыть одновременно?

7 ответов


библиотеки времени выполнения C имеют ограничение 512 для количества файлов, которые могут быть открыты в любой момент времени. Попытка открыть больше максимального количества файловых дескрипторов или файловых потоков приводит к сбою программы. Использовать _setmaxstdio изменить это число. Более подробную информацию об этом можно прочитать здесь

Также вам может потребоваться проверить, поддерживает ли ваша версия windows верхний предел, который вы пытаетесь установить с помощью _setmaxstdio. Для получения дополнительной информации о _setmaxstdio Регистрация здесь

информация по этому вопросу, соответствующая VS 2015, может быть найдена здесь


Если вы используете стандартные библиотеки POSIX C / C++ с Windows, ответ "да", есть предел.

однако, что интересно, ограничение накладывается типом библиотек C / C++, которые вы используете.

я наткнулся на следующий поток JIRA (http://bugs.mysql.com/bug.php?id=24509) из MySQL. Они имели дело с той же проблемой о количестве открытых файлов.

однако Пол Дюбуа объяснил, что проблема может эффективно устраняется в Windows с помощью ...

вызовы Win32 API (CreateFile(), WriteFile () и так далее) и максимальное количество открытых файлов по умолчанию был увеличен до 16384. Этот максимум можно увеличить дальше мимо использование параметра --max-open-files=N в запуск сервера.

естественно, у вас может быть теоретически большое количество открытых файлов, используя метод, подобный пулу подключений к базе данных, но это будет иметь строгое влияние на представлении.

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


в случае, если кто-то еще неясен относительно того, к чему применяется предел, я считаю, что это предел для каждого процесса, а не для всей системы.

Я просто написал небольшую тестовую программу для открытия файлов, пока она не выйдет из строя. Он попадает в 2045 файлов перед сбоем (2045 + STDIN + STDOUT + STDERROR = 2048), затем я оставил это открытым и запустил другую копию.

вторая копия показала такое же поведение, то есть у меня было по крайней мере 4096 файлов, открытых сразу.


Да есть ограничения в зависимости от уровня доступа, который вы используете при открытии файлов. Вы можете использовать _getmaxstdio найти пределы и _setmaxstdio изменить ограничения.


Я не знаю, откуда Пауло взял этот номер.. В операционных системах на базе windows NT количество дескрипторов файлов, открытых для каждого процесса, в основном ограничено физической памятью - это, безусловно, сотни тысяч.


Да, есть предел.

предел зависит от ОС, и доступной памяти.

в старом Д. С. О. предел 255 simultaneuously открытых файлов.

в Windows XP предел выше (я считаю, что это 2,048, как указано MSDN).


столкнулся с той же проблемой, но с использованием Embarcadero C++-Builder из RAD Studio 10.2. C-время выполнения этой вещи, похоже, не обеспечивает _getmaxstdio или _setmaxstdio, но некоторые макрос и их предел по умолчанию намного ниже, чем сказано здесь для других сред выполнения:

С stdio.h:

/* Number of files that can be open simultaneously
*/
#if defined(__STDC__)
#define FOPEN_MAX (_NFILE_)
#else
#define FOPEN_MAX (_NFILE_)
#define SYS_OPEN  (_NFILE_)
#endif

_nfile.h:

#if defined(_WIN64)
#define _NFILE_ 512
#else
#define _NFILE_ 50
#endif