“\Device amedPipe\\Win32Pipes”句柄会导致“打开文件过多”错误吗?
题
继续从 这个问题:
当我尝试在 Windows 上执行 fopen 时,出现“打开文件过多”错误。我尝试分析我有多少个打开的文件,看起来并不算太多。
但是当我执行 Process Explorer 时,我注意到有许多具有相似名称的打开句柄:“\Device amedPipe\Win32Pipes.00000590.000000e2”、“\Device amedPipe\Win32Pipes.00000590.000000e3”等我看到这些句柄的数量恰好等于我的程序在返回“打开文件太多”并停止之前执行的迭代次数。
我正在寻找答案,这些句柄是什么,它们实际上会导致“打开文件过多”错误吗?
在我的程序中,我正在从远程驱动器加载文件,并且正在创建 TCP/IP 连接。这些操作之一可以创建这些句柄吗?
解决方案
您是否记得每次迭代时都 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 *
不隶属于 StackOverflow