2013-03-11 24 views

回答

9

它沒有。調用close()不保證內容在磁盤上,因爲操作系統可能推遲了寫操作。

作爲一個方面說明,總是檢查返回值close()。它會讓你知道到目前爲止的任何延期錯誤。如果您想確保內容在磁盤上,請始終致電fsync()並檢查其返回值。

要記住的一件事是支持商店是什麼。有些設備可能會進行內部寫入推遲,並且在某些情況下內容可能會丟失(雖然較新的存儲介質設備通常使用超級電容來防止此問題,或禁用此功能的方式)。

+0

調用'fsync()'*不會*,出於同樣的原因(硬件可能推遲了寫入)。 – 2013-03-11 20:57:50

+0

@FrédéricHamidi'fsync()'強制寫入存儲,在什麼情況下fsync不能保證磁盤上的內容(除了在某些情況下不能控制的奇怪故障和硬件延遲寫入)? – 2013-03-11 20:59:10

+0

磁盤控制器中可能有(並且通常是)另一層緩存,所以即使'fsync()也不能保證你的數據已經到達了實際的硬件。 'close()'的[man page](http://linux.die.net/man/2/close)確實提到了這一點。 – 2013-03-11 21:01:04

1

號從man 2 close

了圓滿的句號並不能保證該數據已經 成功保存到磁盤,因爲內核推遲寫入。它在文件系統關閉流時刷新緩衝區時不常見於 。如果您需要確保物理存儲的數據是 ,請使用fsync(2)。 (這將取決於磁盤硬件在這一點上。)

0

man 2 close

一個圓滿的句號並不能保證該數據已經 成功保存到磁盤,因爲內核推遲寫入。當流 關閉時,文件系統不會沖洗緩衝區,這不是 。如果您需要確保數據是物理存儲的,請使用 fsync(2)。 (這將取決於磁盤硬潔具在這一點上。)

要回答你的問題,NOclose()不保證fsync()

close只關閉了該進程並刪除文件描述符與該進程關聯的任何記錄鎖。

相關問題