在 Linux 下,我使用此代碼重定向檔案上的 stdout 和 stderr,如代碼所示,該檔案使用 fopen(f) 打開并使用 close(fd) 關閉。
int fd;
FILE *f;
f = fopen("test.txt", "rb ");
fd = fileno(f);
dup2(fd,STDOUT_FILENO);
dup2(fd,STDERR_FILENO);
close(fd);
我的問題是close(fd)陳述句是否關閉所有檔案描述符,還是有必要使用fclose(f)?
uj5u.com熱心網友回復:
規則是關閉最外層。這里指向的 FILE 物件f包含fd檔案句柄,但也包含內部資料,如可能的緩沖區和指向它的各種指標。
使用時close(fd),釋放了與檔案相關的內核結構,但標準庫提供的所有資料結構都沒有釋放。另一方面,fclose(f)會在內部關閉fd檔案句柄,但也會釋放所有由fopen.
TL/DR:如果你fd= open(...);用來打開一個檔案,你應該用close(fd);它來關閉它,但如果你使用f = fopen(...);,那么你應該使用fclose(f);.
uj5u.com熱心網友回復:
C FILE* 流在內部使用緩沖 I/O。fclose() 重繪 此緩沖區,然后在作業系統級別關閉檔案描述符。close()'ing FILE* 流可能不會重繪 此內部緩沖區,您可能會丟失資料。因此,對于 C 流,始終使用 C fxxx() 函式。
uj5u.com熱心網友回復:
正如其他答案中已經指出的那樣,您應該使用fclose(f);而不是close(fd);.
我的問題是 close(fd) 陳述句是否關閉所有檔案描述符 [...]
不,它不會關閉所有檔案描述符。檔案描述符STDOUT_FILENO和STDERR_FILENO仍將保持打開狀態,現在將參考打開的檔案test.txt。但是,這些檔案描述符可能不應該被關閉,因為這是一種很好的編程習慣,STDOUT_FILENO并且STDERR_FILENO在程式結束之前保持有效。它們將在行程終止時由內核自動關閉。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/417882.html
標籤:
上一篇:在C中轉換12位有符號數
