爲什麼我們需要關閉我們打開的文件?我知道這樣的問題 - 如果當前進程沒有關閉它,則不能被另一個進程訪問。但爲什麼在一個進程執行結束時,操作系統會檢查它是否關閉,如果打開則關閉它。這一定是有原因的。什麼是關閉文件的需要?
回答
當你關閉一個文件時,緩衝區被刷新,你寫的所有文件都會被保存到文件中。如果您突然退出程序而沒有刷新(或關閉)FILE * stream
,則可能會丟失數據。
大多數操作系統在進程結束時很好地關閉文件。丟失數據的唯一風險是如果進程崩潰。 –
@JoachimPileborg與文件處理程序不一樣嗎?當程序退出時,在大多數操作系統中,所有處理程序都被釋放,不是嗎? – HAL9000
是的,但它需要過程退出。如果它是一個長時間運行的過程(如服務器程序)呢?如果進程從不關閉它打開的文件,那麼它遲早會用完。 –
兩個字:資源耗盡。無論平臺如何,文件句柄都是有限的資源。如果一個進程只是打開文件並且從不關閉它們,它將很快用完文件句柄。
這使我想問一個與我想問的這個概念有關的問題(希望沒有人在意見中介紹這一點): 假設我的程序創建了很多文件,並且程序崩潰/突然終止。在終止它將關閉所有的描述符反正這些文件的權利?如果我希望這些文件在這種情況下也應該被刪除,那麼有什麼辦法可以實現呢? –
@DiwakarSharma如果你的進程崩潰了,實際的文件描述符將被關閉,但是任何緩衝區都可能沒有被適當的刷新(所以你可能會丟失數據)。刪除這些文件(如果它們是臨時的)的唯一方法是使用適當的臨時文件(例如['tmpfile'](http://linux.die.net/man/3/tmpfile)打開)或手動刪除它們。 –
當一個文件被打開時,文件當然可以被另一個進程訪問。一些語義取決於操作系統。例如,在Unix中,兩個或多個進程可能同時打開一個文件進行寫入。幾乎所有的系統都允許只讀訪問多個進程。
您打開一個文件,將字節流連接到進程中。您關閉文件以斷開連接。當你寫入文件時,由於緩衝,文件可能不會立即修改。這意味着該文件的內存緩衝區被修改,但該更改不會立即反映到磁盤上的文件中。出於性能原因,操作系統將在有足夠數據時反映磁盤中的更改。當你關閉文件時,操作系統將刷新到到磁盤上的文件的更改。
這裏是一個很好的解釋:http://www.cs.bu.edu/teaching/c/file-io/intro/
當寫入到一個輸出文件,該信息是保持在緩衝和關閉文件是一種方式,以確保一切都發布到該文件。
如果您「獲得」了某個資源,那麼在您完成後最好將其釋放。
我認爲相信什麼是O.S.不是一件好事。當進程結束時會做:它可以釋放資源或不釋放資源。普通O.S.是否:它們關閉文件,釋放分配的內存......
但是,如果它不是您使用的語言標準的一部分(例如,如果它實現垃圾收集器),那麼您不應該依賴這種常見行爲。
否則,風險是您的應用程序會鎖定/佔用某些系統上的資源,即使它結束了。
以這種方式,這只是一個很好的做法。最後你沒有義務關閉文件。
想象一下,你會寫出一個親切但雜亂的方法。你會忘記警告,後來發現,這種方法可能在別的地方使用。然後,你會嘗試使用這種方法,也許在一個循環中,你會發現你的程序意外崩潰。你將不得不深入代碼並修復它。那麼爲什麼你不能在開始的時候清理這個函數呢?
你有什麼反對(或者你害怕)關閉文件嗎?
重點是我明天有一個萬歲,如果老師問這個問題 - 關閉文件需要什麼,我不能問她回你害怕關閉文件.. –
- 1. 爲什麼vundle需要的文件類型關閉
- 2. 爲什麼我需要時間關閉流中的文件
- 3. 爲什麼使用它後需要關閉文件?
- 4. 爲什麼需要關閉File.Create?
- 5. 下載文件關閉需要登錄
- 6. 什麼是highcharts-more文件需要?
- 7. 我是否需要關閉執行File.getName()的文件?
- 8. Java - 是否需要關閉「新的FileInputStream」?
- 9. 爲什麼我的文件關閉?
- 10. 在調用ReadAllText之後是否需要關閉文件?
- 11. 在調用syncfs()之前是否需要關閉文件
- 12. ELF文件 - 什麼是部分,爲什麼我們需要它?
- 13. 管道關閉不需要關閉
- 14. 爲什麼我們需要一個半關閉的插座?
- 15. 關閉是什麼意思?
- 16. 是否需要關閉WebInvoke方法流
- 17. ARITHABORT,ARITHIGNORE - 是否需要關閉它?
- 18. 是否需要關閉連接
- 19. 是否需要「關閉」.net配置
- 20. 是否需要關閉PipedInputStream和PipedOutputStream
- 21. 是否需要關閉HttpWebRequest?如何
- 22. 我們是否需要關閉file_get_contents?
- 23. 我是否需要關閉()FileReader和BufferedReader?
- 24. 是否需要關閉JAX-WS端口?
- 25. 是否需要關閉ADO記錄集?
- 26. android的webRTC AEC需要什麼文件?
- 27. 爲什麼關閉curl頭文件?
- 28. 這些文件描述符關閉的目的是什麼?
- 29. 爲什麼我需要關閉安全驗證?
- 30. 我們什麼時候需要關閉MongoConnection
如果你知道問題,你有你的理由:關閉一個文件,以避免這個問題應該是足夠的理由。什麼不清楚? – nvoigt
不保證在退出時系統將關閉由進程打開的文件(或由其分配的空閒內存):它可能只是流行系統的常見行爲,但這不是一個規則。 – ShinTakezou
@nvoigt他問爲什麼有必要在程序退出時關閉文件**,因爲操作系統無論如何都會這樣做。 – Philipp