2014-01-05 142 views
2

爲什麼我們需要關閉我們打開的文件?我知道這樣的問題 - 如果當前進程沒有關閉它,則不能被另一個進程訪問。但爲什麼在一個進程執行結束時,操作系統會檢查它是否關閉,如果打開則關閉它。這一定是有原因的。什麼是關閉文件的需要?

+2

如果你知道問題,你有你的理由:關閉一個文件,以避免這個問題應該是足夠的理由。什麼不清楚? – nvoigt

+0

不保證在退出時系統將關閉由進程打開的文件(或由其分配的空閒內存):它可能只是流行系統的常見行爲,但這不是一個規則。 – ShinTakezou

+0

@nvoigt他問爲什麼有必要在程序退出時關閉文件**,因爲操作系統無論如何都會這樣做。 – Philipp

回答

2

當你關閉一個文件時,緩衝區被刷新,你寫的所有文件都會被保存到文件中。如果您突然退出程序而沒有刷新(或關閉)FILE * stream,則可能會丟失數據。

+1

大多數操作系統在進程結束時很好地關閉文件。丟失數據的唯一風險是如果進程崩潰。 –

+0

@JoachimPileborg與文件處理程序不一樣嗎?當程序退出時,在大多數操作系統中,所有處理程序都被釋放,不是嗎? – HAL9000

+0

是的,但它需要過程退出。如果它是一個長時間運行的過程(如服務器程序)呢?如果進程從不關閉它打開的文件,那麼它遲早會用完。 –

2

兩個字:資源耗盡。無論平臺如何,文件句柄都是有限的資源。如果一個進程只是打開文件並且從不關閉它們,它將很快用完文件句柄。

+0

這使我想問一個與我想問的這個概念有關的問題(希望沒有人在意見中介紹這一點): 假設我的程序創建了很多文件,並且程序崩潰/突然終止。在終止它將關閉所有的描述符反正這些文件的權利?如果我希望這些文件在這種情況下也應該被刪除,那麼有什麼辦法可以實現呢? –

+1

@DiwakarSharma如果你的進程崩潰了,實際的文件描述符將被關閉,但是任何緩衝區都可能沒有被適當的刷新(所以你可能會丟失數據)。刪除這些文件(如果它們是臨時的)的唯一方法是使用適當的臨時文件(例如['tmpfile'](http://linux.die.net/man/3/tmpfile)打開)或手動刪除它們。 –

1

當一個文件被打開時,文件當然可以被另一個進程訪問。一些語義取決於操作系統。例如,在Unix中,兩個或多個進程可能同時打開一個文件進行寫入。幾乎所有的系統都允許只讀訪問多個進程。

您打開一個文件,將字節流連接到進程中。您關閉文件以斷開連接。當你寫入文件時,由於緩衝,文件可能不會立即修改。這意味着該文件的內存緩衝區被修改,但該更改不會立即反映到磁盤上的文件中。出於性能原因,操作系統將在有足夠數據時反映磁盤中的更改。當你關閉文件時,操作系統將刷新到到磁盤上的文件的更改。

1

如果您「獲得」了某個資源,那麼在您完成後最好將其釋放。

我認爲相信什麼是O.S.不是一件好事。當進程結束時會做:它可以釋放資源或不釋放資源。普通O.S.是否:它們關閉文件,釋放分配的內存......

但是,如果它不是您使用的語言標準的一部分(例如,如果它實現垃圾收集器),那麼您不應該依賴這種常見行爲。

否則,風險是您的應用程序會鎖定/佔用某些系統上的資源,即使它結束了。

1

以這種方式,這只是一個很好的做法。最後你沒有義務關閉文件。

想象一下,你會寫出一個親切但雜亂的方法。你會忘記警告,後來發現,這種方法可能在別的地方使用。然後,你會嘗試使用這種方法,也許在一個循環中,你會發現你的程序意外崩潰。你將不得不深入代碼並修復它。那麼爲什麼你不能在開始的時候清理這個函數呢?

你有什麼反對(或者你害怕)關閉文件嗎?

+1

重點是我明天有一個萬歲,如果老師問這個問題 - 關閉文件需要什麼,我不能問她回你害怕關閉文件.. –