Windows XP에서 실행되는 멀티 스레드 응용 프로그램이 있습니다. 특정 단계에서 스레드 중 하나가 fopen 기능을 사용하여 기존 파일을 열지 못했습니다. _get_errno 함수는 을 의미하는 EMFILE을 반환합니다. 열려있는 파일이 너무 많습니다. 더 이상 사용할 수있는 파일 설명자가 없습니다.. 내 플랫폼에 대한 FOPEN_MAX 내가 WinDbg는 이것을 확인 512을 반환 _getmaxstdio (20) 내가 약 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);
}
}
}
아마도 윈도우는 프로세스 당 512 개의 디스크립터 ('stdin'과'stdout'의 경우 2)를 가질 수 없다. 그리고 아마도 쓰레드를 사용하는 것은 몇몇 서술자를 소비 할 수도 있습니다. 이 시점에서 나는 단지 추측 할 수 있습니다. Windows 커널 전문가는 아닙니다. – ereOn
질문을 편집 할 수 있습니다. 의견에 소스 코드를 쓸 필요가 없습니다 – codymanix