我有一個多線程的應用程序運行在Win XP上。在某個階段,其中一個線程無法使用fopen函數打開現有文件。 _get_errno函數返回EMFILE,這意味着打開的文件過多。沒有更多文件描述符可用。 FOPEN_MAX我的平臺是20 _getmaxstdio返回512我的WinDbg覈實這一點,我看到約100文件打開:fopen問題 - 太多打開的文件
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);
}
}
}
也許Windows對每個進程有512個描述符的限制(stdin和stdout減2)。也許使用線程也會消耗一些描述符。在這一點上,我只能猜測。我遠不是Windows內核專家。 – ereOn 2010-07-06 12:29:04
你可以編輯你的問題,無需將源代碼寫入註釋 – codymanix 2010-07-07 11:20:49