簡體   English   中英

為什么在fopen()沒有關閉后調用close()?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM