2012-06-10 41 views
1
static char filename[128] = "trace.txt"; 

g_file = fopen(filename, "w"); 
if(NULL == g_file) 
{ 
     printf("Cannot open file %s.error %s\n",filename,strerror(errno)); 
     exit(1); 
} 

我試圖打開一個名爲trace.txt在寫模式下的空文本文件(在我的工作目錄。) 該方案是創建一個空文件trace.txt在我的目錄。但檢查(NULL == g_file) 返回true,它返回錯誤代碼24(太多打開的文件。)。任何想法爲什麼這是。這是我打開的第一個文件我的程序。FOPEN在C(Linux)的返回「打開的文件太多」

令人驚訝的是,代碼是通過指定的名稱在我的工作目錄中創建一個空文件。但是由於某種原因,對空文件指針的檢查是成功的。 :(

+1

嘗試在'strace'下運行你的程序。 –

+0

也許你達到了一些限制或配額。另見http://stackoverflow.com/a/10908462/841108 –

回答

8

您可能有文件描述符泄漏。
如果您的代碼保持打開文件,永不關閉它們,您遲早會達到限制,然後fopen將會失敗。

您可以通過打印每次打開文件時得到的文件描述符編號來檢查此問題。如果他們繼續增長,你有泄漏。

1

這看起來像一個類似的問題,你遇到了什麼,但我不能完全肯定這是否會幫助你解決問題可能是值得一看:

Problem with writing to file in C

2

這是最有可能是由於你的系統達到其最大允許打開的文件句柄

您可以輕鬆地運行測試這種以下內容:

$ dd if=/dev/urandom of=test.dat bs=16 count=1 

如果您沒有文件句柄,則應該提供相同或類似的錯誤。

可以麻煩拍攝此使用一些下面的命令:

要查看所允許的最大打開文件:

$ cat /proc/sys/fs/file-max 

要查看哪些文件是當前打開的(記住這包括設備文件,插座等):

$ lsof 

您還可以使用lsof獲得的打開的文件數:

$ lsof | wc -l