[英]Why is calling close() after fopen() not closing?
我在我們的一個內部dll中遇到了以下代碼,我試圖了解它顯示的行為:
long GetFD(long* fd, const char* fileName, const char* mode)
{
string fileMode;
if (strlen(mode) == 0 || tolower(mode[0]) == 'w' || tolower(mode[0]) == 'o')
fileMode = string("w");
else if (tolower(mode[0]) == 'a')
fileMode = string("a");
else if (tolower(mode[0]) == 'r')
fileMode = string("r");
else
return -1;
FILE* ofp;
ofp = fopen(fileName, fileMode.c_str());
if (! ofp)
return -1;
*fd = (long)_fileno(ofp);
if (*fd < 0)
return -1;
return 0;
}
long CloseFD(long fd)
{
close((int)fd);
return 0;
}
在使用適當的CloseFD重復調用GetFD之后,整個dll將不再能夠執行任何文件IO。 我寫了一個測試程序,發現我可以GetFD 509次,但第510次會出錯。
使用Process Explorer,Handles的數量沒有增加。
所以似乎dll達到了打開文件數量的限制; 設置_setmaxstdio(2048)
會增加我們調用GetFD的次數。 顯然,close()工作正常。
經過一些搜索,我用以下命令替換了fopen()
調用:
long GetFD(long* fd, const char* fileName, const char* mode)
{
*fd = (long)open(fileName, 2);
if (*fd < 0)
return -1;
return 0;
}
現在,反復調用GetFD / CloseFD工作。
這里發生了什么?
如果使用fopen
打開文件,則必須使用fclose
對稱方式關閉它。
必須為C ++運行時提供清理/取消分配其內部文件相關結構的機會。
您需要將fclose
與通過fopen
文件一起使用,或者close
通過open
文件。
您使用的標准庫具有靜態FILE
結構數組。 因為您沒有調用fclose()
,所以標准庫不知道底層文件已經關閉,所以它不知道它可以重用相應的FILE
結構。 在FILE
數組中的條目用完后會出現錯誤。
fopen
打開它自己的文件描述符,因此你需要在原始函數中執行fclose(ofp)
以防止文件描述符用完。 通常,一個使用低級文件描述符函數open, close
或緩沖的fopen, fclose
函數。
你打開文件fopen()函數所以你必須關閉文件使用fclose(),如果你使用open()函數並嘗試調用fclose()函數它將無法正常工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.