簡體   English   中英

fclose似乎在C中不起作用

[英]fclose doesn't seem to be working in C

    FILE *file = fopen(argv[1], "r");
    if(file != NULL){
        char command[MAX_BUFFER];
        while(fgets(command, MAX_BUFFER, file) != NULL){ //read line
            //operations
        }
        fclose(file);
    }
    else write(fileno(stderr), ERROR_MESSAGE, strlen(ERROR_MESSAGE));

我正在研究一個非常基本的UNIX shell實現,該實現從文件逐行讀取和執行。 從上面的代碼中,我試圖找出為什么fclose()可能會失敗,因為valgrind似乎在告訴我我未打開此文件描述符。

我是否假設泄漏摘要中的“仍可到達” 568個字節以某種方式引用了失敗的fclose()是正確的嗎?

==25428== FILE DESCRIPTORS: 4 open at exit.
==25428== Open file descriptor 3: test
==25428==    at 0x4F186B0: __open_nocancel (syscall-template.S:82)
==25428==    by 0x4EAC628: _IO_file_fopen@@GLIBC_2.2.5 (fileops.c:233)
==25428==    by 0x4EA1265: __fopen_internal (iofopen.c:93)
==25428==    by 0x400C0C: main (in /home/Desktop/sh)
==25428== 
==25428== Open file descriptor 2: /dev/pts/0
==25428==    <inherited from parent>
==25428== 
==25428== Open file descriptor 1: /dev/pts/0
==25428==    <inherited from parent>
==25428== 
==25428== Open file descriptor 0: /dev/pts/0
==25428==    <inherited from parent>
==25428== 
==25428== LEAK SUMMARY:
==25428==    definitely lost: 0 bytes in 0 blocks
==25428==    indirectly lost: 0 bytes in 0 blocks
==25428==      possibly lost: 0 bytes in 0 blocks
==25428==    still reachable: 568 bytes in 1 blocks
==25428==         suppressed: 0 bytes in 0 blocks

對,檢查返回值,也陷入困境以獲得簡短的解釋。 如果要確認它仍處於打開狀態,請嘗試lsof,但是由於程序名稱或pid可能很多,因此可能需要grep它。

您可見的代碼看起來還可以。 但是要回答你的問題:可能,但是問題出在其他地方;-)

要調試程序,請注釋掉“操作”,以免產生空循環。 valgrind還在抱怨嗎?

否:問題很可能出在您命名為“ operations”的代碼內。

刪除注釋並在(-g)上使用調試符號進行編譯,然后將valgrind與以下選項一起使用:valgrind --leak-check = yes --show-reachable = yes --track-origins = yes您的程序

是的:(極不可能)有其他東西被破壞,請嘗試使用更多注釋的代碼來驗證。

要在編譯時發現錯誤,請使用編譯器的標志(例如,gcc具有-Wall -Wextra -Wwrite-strings -Wformat = 2 -Wformat -Wformat-security -D_FORTIFY_SOURCE = 2及以上)。

並使用靜態分析器,例如llvm / clang(使用clang編譯--analyze yourprogram.c)

@rockdaboot注釋掉我的操作的建議表明我仍在丟失內存,但至少我不知道它來自fclose ...謝謝大家的提示! 回到調試!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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