2012-10-10 5 views
1

수, C 열려있는 파일 : 열려있는 파일 ALL

내 프로그램 C에

probleme을 열어 파일의 수를 얻기 위해 어떤 해결책이된다 : 반면 렉스와 파일의 목록의 구문 분석 yacc

yyin (yywrap) 끝에 현재 스트림의 fopen을 받는다. fclose :를 사용하여 yyin을 닫는다. 그래서 일반적으로 열려있는 파일의 수는 0이다. 몇 가지 예를 들어 내가 fopen (많은 opned 파일)을 호출 할 때이 오류 예외가 발생

그래서 내 질문은 어떻게이 문제를 디버깅하기 위해 opned 파일의 수를 시스템 명령에서 얻을 수 있습니다. 도움

+3

아마도 코드를 게시하는 것이 도움이 될 것입니다. –

+0

나는 내 문제를 해결했다 : openfiles라고 불리는 시스템 기능이있다. 당신의 프로세스를 위해 열린 파일 목록이다. 중복 된 포함에 대한 uneeded fopen이 문제가 발생했습니다. 모두 – Aymanadou

답변

1

, 당신은 (내 생각)을 찾는 일이 같은 트릭을 달성 할 수 있습니다 물론

#include <stdio.h> 

unsigned int open_files = 0; 

FILE *fopen_counting(const char *path, const char *mode) 
{ 
    FILE *v; 
    if((v = fopen(path,mode)) != NULL) ++open_files; 
    return v; 
} 

int fclose_counting(FILE *fp) 
{ 
    int v; 
    if((v = fclose(fp)) != EOF) --open_files; 
    return v; 
} 

#define fopen(x,y) fopen_counting(x,y) 
#define fclose(x) fclose_counting(x) 

, 스 니펫 이렇게하면 제어 할 코드에만 영향을 미칩니다. fopen 또는 fclose에 대한 호출이 이루어지기 전에 #include d가되어야합니다. 그렇지 않으면 대체 대신 원래 함수가 호출됩니다.

열린 파일 디스크립터의 현재 수를 반환하는 시스템 기능에 관해서는, 불행히도 그런 것을 인식하지 못했습니다. 하지만 디버거에서 응용 프로그램을 실행하고 중단 점을 fopen에 설정하고 단순히 OS 도구를 사용하여 해당 번호를 확인하는 것을 멈추게하는 것은 무엇입니까? Linux에서 프로세스의 열린 파일 디스크립터의 수는 /proc/$PID/fd 디렉토리의 항목 수와 같습니다. 이렇게하면 어떤 실제 파일이 어떤 파일 디스크립터에 할당되는지 알 수 있습니다.

0

당신은 정수를 사용할 수에 대한

thnks, 그것은 동일한 0에 그리고 당신이 fopen을 사용하고 fclose 사용할 때마다 그것을 감소 ​​할 때마다 증가 설정합니다. 당신이 fopenfclose를 사용하는 경우

file *fp;     
int files_opened = 0;  //number of open files 

if(!(fp = fopen("file.txt", "r"))) //open file 
{ 
          //could not open file 
} 
else files_opened++;  //we opened a file so increment files_opened 
printf("\n%d files are currently open.", files_opened); //display how many files currently open 
if(!(fclose(fp) != EOF))) //close file 
{ 
    //could not close file 
} 
else files_opened--;  //we closed a file so decrement files_opened 
printf("\n%d files are currently open.", files_opened); //display how many files currently open 
+0

thnks가 단순 해 보입니다. 시스템에서이 정보를 얻을 수 있는지 묻습니다.이 함수는 whiter가 strerror (errno) 파일을 열 때 오류를 반환합니다. – Aymanadou

+0

내 대답이 업데이트되었습니다. 직접 그것을 추적해야 할 것입니다. 이것이 내가하는 방법이다. 그러나 상황이 다를 수 있습니다. –

+0

나는 또한 당신을 위해 내 질문을 업데이 트, 당신이 생각하는 것처럼 그렇게 분명하지 않습니다. – Aymanadou

관련 문제