O “ dispositivo nomeadopipe win32pipes” pode causar um erro de “muitos arquivos abertos”?
Pergunta
Continuando de essa questão:
Quando estou tentando fazer no Windows, recebo um erro "muitos arquivos abertos". Tentei analisar, quantos arquivos abertos eu tenho e parece não muito.
Mas quando executei o Process Explorer, notei que tenho muitas alças abertas com nomes semelhantes: " dispositivo nomeadopipe win32pipes.00000590.000000E2", " dispositivo nomeadopipe win32pipes.00000590.000000e3", etc., eu vejo que isso Destas alças é exatamente igual ao número de iterações executadas no meu programa, antes de retornar "muitos arquivos abertos" e parar.
Estou procurando uma resposta, quais são essas alças e eles poderiam realmente causar o erro "muitos arquivos abertos"?
No meu programa, estou carregando arquivos da unidade remota e estou criando conexões TCP/IP. Uma dessas operações poderia criar essas alças?
Solução
Você está se lembrando de fclose () seu tubo a cada vez através da iteração? (Veja -> abaixo).
Caso contrário, você está vazando tubos abertos.
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!)
}
}
No entanto, se sua intenção é uma das alças de arquivo abertas de uma só vez, a outra coisa a estar ciente é que o tempo de execução C normalmente especifica uma série de alças de arquivo que você pode abrir ao mesmo tempo. Esse número normalmente será muito menor que o sistema operacional é capaz de fornecer. Para usar as alças de arquivo fornecidas pelo sistema operacional, você precisará usar as funções da API Win32/Win64:
- Createfile
- ReadFile
- Writefile
- GetFilesize
- CloseHandle
Os alças de arquivo fornecidas pelo sistema operacional são de tipo de tipo que não é arquivo *