Win XP でマルチスレッド アプリケーションを実行しています。特定の段階で、スレッドの 1 つが 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);
}
}
}