Проблема Fopen - слишком много открытых файлов
-
02-10-2019 - |
Вопрос
У меня есть многопоточное приложение, работающее на Win XP. На определенном этапе один из потоков не удается открыть существующий файл с использованием функции Fopen. _get_errno Функция Возвращает Emfile, что означает Слишком много открытых файлов. Больше файловых дескрипторов доступны. Отказ Fopen_max для моей платформы 20. _getmaxstdio возвращает 512. Я проверил это windbg, и я вижу, что около 100 файлов открыты:
788 Handles
Type Count
Event 201
Section 12
File 101
Port 3
Directory 3
Mutant 32
WindowStation 2
Semaphore 351
Key 12
Thread 63
Desktop 1
IoCompletion 6
KeyedEvent 1
В чем причина того, что Fopen терпит неудачу?
РЕДАКТИРОВАТЬ:
Я написал простую однопоточное тестовое приложение. Это приложение может открывать 510 файлов. Я не понимаю, почему это приложение может открывать больше файлов, а затем многопоточное приложение. Это может быть из-за утечек ручки файлов?
#include <cstdio>
#include <cassert>
#include <cerrno>
void main()
{
int counter(0);
while (true)
{
char buffer[256] = {0};
sprintf(buffer, "C:\\temp\\abc\\abc%d.txt", counter++);
FILE* hFile = fopen(buffer, "wb+");
if (0 == hFile)
{
// check error code
int err(0);
errno_t ret = _get_errno(&err);
assert(0 == ret);
int maxAllowed = _getmaxstdio();
assert(hFile);
}
}
}
Решение
Я думаю, что в Win32 все функция CRT, наконец, завершится с помощью API Win32 внизу. Таким образом, в этом случае наиболее вероятно, он должен использовать CreateFile / OpenFile Win32. Теперь API CreatFile / OpenFile не предназначен только для файлов (файлов, каталогов, портов связи, трубы, слоты почтовых слотов, объемов привода и т. Д.). Таким образом, в реальном применении в зависимости от количества этих ресурсов ваш максимальный открытый файл может варьироваться. Так как вы не описали много о приложении. Это мое первое предположение. Если время разрешает пройти через это http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx.
Другие советы
Я думаю, это ограничение вашей операционной системы. Он может зависеть от многих вещей: то, как файловые дескрипторы представлены, память, которую они потребляют, и так далее.
И я полагаю, что нет ничего, что вы можете сделать с этим. Возможно, есть какой-то параметр, чтобы настроить этот предел.
Настоящий вопрос в том, вам действительно нужно открыть это много файлов одновременно? Я имею в виду, даже если у вас есть более 100 потоков, пытаясь прочитать 100+ разных файлов, они, вероятно, не смогут прочитать их одновременно, и вы, вероятно, не получите никакого лучшего результата, чем наличие, как пример, 50 потоков Отказ
Трудно быть точнее, так как мы не знаем, что вы пытаетесь достичь.