Вопрос

У меня есть многопоточное приложение, работающее на 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 потоков Отказ

Трудно быть точнее, так как мы не знаем, что вы пытаетесь достичь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top