2012-10-10 239 views
1

ALL的數量,C打開文件:打開文件

有任何解決方案,使打開的文件數在我的方案C

的probleme是:同時使用lex文件列表的解析和yacc

yyin收到當前流的fopen,最後(yywrap)我使用fclose關閉yyin:所以通常打開的文件的數量等於零。 對於一些例子,我得到這個錯誤異常,當我打電話一個打開(許多選定的文件)

所以我的問題是我如何從系統命令獲得選定文件的數目,以調試此問題。

thnks求助

+3

這可能會有助於發佈一些代碼。 –

+0

我解決了我的問題:有一個稱爲openfiles的系統函數,它描述了您的進程打開的文件的偵聽。 重複包括一個未完成的fopen導致此問題thk所有 – Aymanadou

回答

1

如果使用fopenfclose,那麼你正在尋找(我認爲)的東西可能是一招取得這樣的:

#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) 

當然,一個片段像這樣只會影響您控制的代碼:在對fopenfclose進行任何調用之前,必須爲#included - 否則將調用原始函數而不是您的替換。

當涉及到一個系統函數,將返回當前打開的文件描述符的數量,我很遺憾不知道這樣的事情。但是什麼阻止了你在調試器下運行你的應用程序,在fopen上設置斷點,並簡單地使用OS工具來檢查這個數字?在Linux上,進程中打開文件描述符的數量等於目錄/proc/$PID/fd中的條目數 - 通過這樣做,您甚至可以知道哪個實際文件分配給哪個文件描述符。

0

你可以使用一個整數,將其設置爲0,並在每次使用fopen並在每次使用fclose時間遞減它的時候加一。

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它看起來很簡單,我問我是否可以從系統中獲取此信息,例如此函數返回錯誤打開文件strerror(errno) – Aymanadou

+0

我更新了我的答案,你將不得不自己跟蹤它。這是我的方式。但你的情況可能會有所不同。 –

+0

我也爲你更新了我的問題,這並不像你想象的那麼明顯。 – Aymanadou