可以“\ Device \ NamedPipe \\ Win32Pipes”处理导致“打开文件太多”错误?

时间:2010-03-15 11:08:14

标签: windows file handle fopen

继续this question

当我尝试在Windows上执行fopen时,我收到“太多打开文件”错误。我试着分析一下,我有多少个打开的文件,看起来并不太多。

但是当我执行Process Explorer时,我注意到我有许多类似名称的打开句柄:“\ Device \ NamedPipe \ Win32Pipes.00000590.000000e2”,“\ Device \ NamedPipe \ Win32Pipes.00000590.000000e3”等我看到了这些句柄的数量与我的程序执行的迭代次数完全相同,然后返回“打开的文件太多”并停止。

我正在寻找答案,这些句柄是什么,它们实际上是否会导致“打开太多文件”错误?

在我的程序中,我正在从远程驱动器加载文件,我正在创建TCP / IP连接。其中一个操作可以创建这些句柄吗?

1 个答案:

答案 0 :(得分:1)

你是否还记得每次迭代时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运行时通常会指定您可以在任何时间打开的许多文件句柄。该数字通常比操作系统能够提供的少得多。要使用OS提供的文件句柄,您需要使用Win32 / Win64 API函数:

  • 的CreateFile
  • ReadFile的
  • WriteFile的
  • GetFileSize
  • CloseHandle的

OS提供的文件句柄类型为HANDLE而不是FILE *