如果使用fopen()以不同的模式打開文件,那麼是否有必要關閉它的時間或它可以在代碼結束時關閉一次?是否需要關閉在程序中打開的文件編號?
回答
open
函數是創建流的fopen
和freopen
函數的基礎原語。
int open (const char *filename, int flags[, mode_t mode])
創建並返回一個新的文件描述由filename
命名的文件。參數mode
僅在創建文件時使用,但在任何情況下都不會影響提供參數。
所以每當一個open
或fopen
調用時創建一個新的文件描述這些描述住宿分配,直到程序結束。
函數close
或fclose
關閉文件描述符字段。關閉文件具有以下後果:
- 將文件描述符解除分配。
- 解鎖文件上的進程擁有的任何記錄鎖。
- 當與管道或FIFO關聯的所有文件描述符已關閉時,將丟棄任何未讀數據。
如果open
或fopen
也不要close
,那麼描述將不被清理,並且將持續到程序關閉。
如果有很多可能會被多次打開(而不必每次關閉)的open
或任何文件調用的問題很嚴重,那麼描述將泄露,直到OS或者拒絕或無力創建另一個描述符,在這種情況下,對fopen
的調用失敗並且程序可能崩潰。
在大多數POSIX操作系統(包括Linux和Os X)上,每個進程都分配了一個固定的文件句柄表或文件描述符表。這通常約爲1024個手柄。當您嘗試打開第1025個文件描述符時,操作系統會終止您的進程。
問題幾乎可以肯定是你正在泄漏文件句柄。也就是說,句柄正在被打開,並且在你完成它們之後,它們不會被關閉。
爲了避免描述泄漏,必須需要每次文件被重新打開,以close
或fclose
之前。
看看GNU描述的關於Opening and Closing Files。
你必須關閉所有這些。
當您使用open
- 家庭系統調用,他們返回你file-descriptor
(fopen
回報FILE*
這基本上是containts文件描述符的結構體。對文件定義一看)。
typedef struct
{
short level ;
short token ;
short bsize ;
char fd ; <-- here
unsigned flags ;
unsigned char hold ;
unsigned char *buffer ;
unsigned char * curp ;
unsigned istemp;
}FILE ;
結果fopen()
你會給你兩種不同的FILE *(和不同的文件描述符明顯),你應該close()/fclose()
最後。
並解釋得很好。但是我應該怎麼做才能避免這樣的事情? – ameyCU
我不認爲僅僅保存兩個文件描述符而不是一個太糟糕,並關閉它們。這真的取決於你想要做什麼。 –
- 1. 在函數中打開的文件不需要手動關閉?
- 2. 是否需要關閉使用window.openDatabase打開的數據庫?
- 3. 我是否需要關閉Quartz調度程序在finally塊中?
- 4. SQLiteAssetHelper是否需要打開和關閉方法
- 5. 我是否需要在C程序中編譯頭文件?
- 6. 什麼是關閉文件的需要?
- 7. 如果用Python中的'print'打開文件,不需要關閉該文件嗎?
- 8. 防止在Python中打開文件時關閉應用程序
- 9. 打開文件後檢查文件是否被修改關閉
- 10. 是否可以通過編程方式打開/關閉3V3?
- 11. 在調用ReadAllText之後是否需要關閉文件?
- 12. 在調用syncfs()之前是否需要關閉文件
- 13. 關閉通用應用程序中打開的文件
- 14. 是否關閉用os.fdopen打開的文件關閉os級別的fd?
- 15. 打開文件時總是關閉
- 16. Java - 是否需要關閉「新的FileInputStream」?
- 17. 檢測3gb開關是否以編程方式打開或關閉
- 18. 我是否需要關閉執行File.getName()的文件?
- 19. 「open」類的初始化程序是否也需要打開?
- 20. PHP在包含文件中打開大括號,但未關閉
- 21. 應用程序是否允許用戶打開或關閉iCloud?
- 22. 關閉無法打開的文件是否有意義
- 23. 檢查用fopen打開的文件是否已關閉
- 24. 是否需要在調用mmap之後打開文件?
- 25. IOS IPAD UIpopovercontroller需要關閉並打開相同的過程
- 26. 如果您使用'with'語句打開文件,是否還需要關閉文件對象?
- 27. 是否需要編寫驅動程序
- 28. 需要一個Applescript來關閉所有打開的郵件
- 29. 是否需要關閉WebInvoke方法流
- 30. ARITHABORT,ARITHIGNORE - 是否需要關閉它?
你在這裏說描述符泄漏。那究竟意味着什麼? – ameyCU
@ameyCU編輯了答案。再看一看。 –
謝謝:)它解釋了很多! – ameyCU