Могут ли дескрипторы «\ Device \ NamedPipe \\ Win32Pipes» вызвать ошибку «Слишком много открытых файлов»? - PullRequest
0 голосов
/ 15 марта 2010

Продолжая с этот вопрос :

Когда я пытаюсь выполнить fopen в Windows, я получаю сообщение об ошибке «Too many open files». Я попытался проанализировать, сколько открытых файлов у меня есть, и кажется, не слишком много.

Но когда я запустил Process Explorer, я заметил, что у меня есть много открытых дескрипторов с похожими именами: "\ Device \ NamedPipe \ Win32Pipes.00000590.000000e2", "\ Device \ NamedPipe \ Win32Pipes.00000590.000000e3" и т. Д. Я вижу что число этих дескрипторов точно равно числу итераций, которые выполнила моя программа, прежде чем она вернула «Слишком много открытых файлов» и остановилась.

Я ищу ответ, что это за дескрипторы, и действительно ли они могут вызвать ошибку "Too many open files"?

В моей программе я загружаю файлы с удаленного диска и создаю соединения TCP / IP. Может ли одна из этих операций создать эти дескрипторы?

1 Ответ

1 голос
/ 15 марта 2010

Вы помните, чтобы fclose () ваш канал каждый раз проходил итерацию? (см. -> ниже).

Если нет, вы протекаете открытые трубы.

for(i = 0; i < lotsOfIterations; i++)
{
    FILE *fp;

    fp = fopen(filename[i], "r");
    if (fp != NULL)
    {
        ... do work, etc

        fclose(fp); // finished with this file handle (add this line!)
    }
}

Однако, если ваше намерение состоит в том, чтобы одновременно открывалось много файловых дескрипторов, необходимо помнить и о том, что среда выполнения C обычно определяет количество файловых дескрипторов, которые вы можете открыть одновременно. Это число обычно будет намного меньше, чем может предоставить операционная система. Чтобы использовать предоставляемые ОС дескрипторы файлов, вам нужно будет использовать функции Win32 / Win64 API:

  • CreateFile
  • ReadFile
  • WriteFile
  • GetFileSize
  • CloseHandle

Операционные файловые дескрипторы имеют тип HANDLE, а не FILE *

...