【问题标题】:Can "\Device\NamedPipe\\Win32Pipes" handles cause "Too many open files" error?“\Device\NamedPipe\\Win32Pipes”句柄会导致“打开文件过多”错误吗?
【发布时间】:2010-03-15 11:08:13
【问题描述】:

this question继续:

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

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

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

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

【问题讨论】:

    标签: windows file handle fopen


    【解决方案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 *

    【讨论】:

    • 当您用完打开的句柄时,您将用完打开的文件,例如例如FILE* 由句柄支持。
    • 我不打算同时打开很多文件句柄。我想找到问题的根本原因——我的程序中没有关闭哪些句柄。看起来这些不是文件句柄,而是那些 NamedPipes。我试图了解它们是什么,它们是否与打开的文件、打开的套接字或其他任何东西有关。
    • Stephen:最终我发现我的管道没有关闭。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多