2010-07-06 3 views
2

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); 
     } 
    } 
} 
+0

아마도 윈도우는 프로세스 당 512 개의 디스크립터 ('stdin'과'stdout'의 경우 2)를 가질 수 없다. 그리고 아마도 쓰레드를 사용하는 것은 몇몇 서술자를 소비 할 수도 있습니다. 이 시점에서 나는 단지 추측 할 수 있습니다. Windows 커널 전문가는 아닙니다. – ereOn

+0

질문을 편집 할 수 있습니다. 의견에 소스 코드를 쓸 필요가 없습니다 – codymanix

답변

1

나는 win32에서 모든 crt 기능이 마침내 win32 API를 사용하여 강화 될 것이라고 생각한다. 따라서이 경우에는 대부분 Win32의 CreateFile/OpenFile을 사용해야합니다. 이제 CreatFile/OpenFile API는 파일 (파일, 디렉토리, 통신 포트, 파이프, 메일 슬롯, 드라이브 볼륨 등)에만 사용되는 것이 아닙니다. 따라서 번호에 따라 실제 응용 프로그램에서 이러한 리소스는 최대 열린 파일이 다를 수 있습니다. 당신이 그 응용 프로그램에 대해 많이 설명하지 않았기 때문에. 이것은 내 첫 번째 추측입니다. 시간이 허락한다면 http://blogs.technet.com/b/markrussinovich/archive/2009/09/29/3283844.aspx

5

이것은 사용중인 운영 체제의 제한 사항입니다. 그것은 파일 디스크립터가 표현되는 방식, 그들이 소비하는 메모리 등 많은 것들에 의존 할 수있다.

그리고 나는 그것에 대해 할 수있는 일이 많지 않다고 생각합니다. 아마도 그 한계를 조정할 수있는 매개 변수가있을 것입니다.

정말로 많은 파일을 동시에 열어야합니까? 100 개 이상의 스레드가 100 개 이상의 다른 파일을 읽으 려해도 100 개 이상의 스레드가 동시에 읽을 수는 없으므로 예를 들어 50 개 스레드를 사용하는 것보다 더 나은 결과를 얻을 수는 없습니다. .

우리가 성취하려는 것을 모르기 때문에 더 정확하기가 어렵습니다.

+0

시스템 미세 조정을 시작하기 전에 무엇이 문제의 원인이며 열린 최대 파일 수가 일정하지 않은지 이해하고 싶습니다 (95와 103 사이에 차이가 있음). 이것에 영향을 미치는 다른 요인은 무엇입니까? 이벤트, 세마포 또는 디렉토리 핸들? – tommyk

+0

@tommyk : 이것은 추측 일 뿐이며 운영 체제에 대한 깊은 지식이 없습니다 (주로 Windows, Linux 또는 다른 어떤 것인지 여부를 말하지 않았기 때문에 D :). 필자는 일부 시스템에서는 파일 디스크립터가 전역이며 사용 가능한 디스크립터 (소켓, 파일, 뮤텍스 등)의 수를 다른 프로세스와 OS 자체로 제한한다고 가정합니다. – ereOn

+0

내 플랫폼은 Windows XP (32 비트)입니다. – tommyk