我有一个运行在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);
}
}
}
stdin
和stdout
的2个)。也许使用线程也会消耗一些描述符。目前为止,我只能猜测。我远非Windows内核专家。 - ereOn