0

继续这个问题

当我尝试在 Windows 上执行 fopen 时,我收到“打开的文件太多”错误。我试图分析,我有多少打开的文件,似乎并没有太多。

但是当我执行 Process Explorer 时,我注意到我有许多具有相似名称的打开句柄:“\Device\NamedPipe\Win32Pipes.00000590.000000e2”、“\Device\NamedPipe\Win32Pipes.00000590.000000e3”等。我看到了数字这些句柄的数量正好等于我的程序在返回“打开的文件太多”并停止之前执行的迭代次数。

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

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

4

1 回答 1

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 运行时通常会指定您可以随时打开的文件句柄数量。这个数字通常比操作系统能够提供的要少得多。要使用操作系统提供的文件句柄,您需要使用 Win32/Win64 API 函数:

  • 创建文件
  • 读取文件
  • 写文件
  • 获取文件大小
  • 关闭手柄

操作系统提供的文件句柄的类型是 HANDLE 而不是 FILE *

于 2010-03-15T11:30:19.923 回答