gpt4 book ai didi

c++ - fopen 问题 - 打开的文件太多

转载 作者:可可西里 更新时间:2023-11-01 13:55:06 26 4
gpt4 key购买 nike

我有一个在 Win XP 上运行的多线程应用程序。在某个阶段,其中一个线程无法使用 fopen 函数打开现有文件。 _get_errno 函数返回 EMFILE,这意味着 打开的文件太多。没有更多的文件描述符可用。我的平台的 FOPEN_MAX 是 20。_getmaxstdio 返回 512。我用 WinDbg 检查了这个,我看到大约有 100 个文件打开:

788 Handles
Type Count
Event 201
Section 12
File 101
Port 3
Directory 3
Mutant 32
WindowStation 2
Semaphore 351
Key 12
Thread 63
Desktop 1
IoCompletion 6
KeyedEvent 1

fopen 失败的原因是什么?


编辑:

我编写了简单的单线程测试应用程序。这个应用程序可以打开 510 个文件。我不明白为什么这个应用程序可以打开比多线程应用程序更多的文件。会不会是因为文件句柄泄漏?

#include <cstdio> 
#include <cassert>
#include <cerrno>
void main()
{
int counter(0);

while (true)
{
char buffer[256] = {0};
sprintf(buffer, "C:\\temp\\abc\\abc%d.txt", counter++);
FILE* hFile = fopen(buffer, "wb+");
if (0 == hFile)
{
// check error code
int err(0);
errno_t ret = _get_errno(&err);
assert(0 == ret);
int maxAllowed = _getmaxstdio();
assert(hFile);
}
}
}

最佳答案

我想这是您操作系统的限制。它可能取决于很多因素:文件描述符的表示方式、它们消耗的内存等等。

而且我想您对此无能为力。也许有一些参数可以调整这个限制。

真正的问题是,您真的需要同时打开那么多文件吗?我的意思是,即使你有 100 多个线程试图读取 100 多个不同的文件,它们也可能无法同时读取它们,并且你可能不会得到比拥有 50 个线程更好的结果.

很难做到更准确,因为我们不知道您想要达到的目标。

关于c++ - fopen 问题 - 打开的文件太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3184345/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com