2017-10-13 21 views
0

當我閱讀文檔renamehttps://linux.die.net/man/3/rename的頁面,我發現下面的Linux API更名行爲,當新指向現有的文件

如果存在通過新的參數命名的鏈接,它應是刪除並重新更名爲新的。在這種情況下,名爲new的鏈接在整個重命名操作中對其他進程始終可見,並在操作開始之前引用new或old引用的文件。對於包含舊目錄的目錄和包含新目錄的目錄都需要寫入訪問權限。

我應該如何理解以下

是指無論是通過新的或舊提到的文件的操作在這種情況下開始

與具有相同名稱的文件之前什麼new點存在,則在重命名操作後,new應該指向oldnew。但文件說這是before the operation began這讓我感到困惑。

我應該怎麼理解?你能舉個例子嗎?

回答

0

這句話的含義是,在rename期間,舊的new被替換爲新的new原子。

這意味着在重命名操作期間嘗試訪問new將導致找不到文件錯誤。每次訪問都會導致返回舊的或新的new

在完成rename(假設成功完成)後,當然將以該名稱引用新的new

這突出rename的原子替換文件的用處。如果你有一個包含一些重要文件的路徑,並且你需要更新該文件,使得無論發生什麼事,任何人在任何時候打開/var/lib/important都將獲得舊版本或新版本,這是您需要的操作序列請執行以下操作:

  • 使用路徑/var/lib/important.new創建文件的更新版本。
  • 沖洗並關閉/var/lib/important.new
  • rename("/var/lib/important.new", "/var/lib/important");
  • 根據您的使用情況,沖洗/var/lib

這保證無論發生什麼事情(進程崩潰,電源故障,內核故障),舊的或新的文件都可用,完整且正確。

只有當您需要依賴它作爲可用文件的新版本時,才需要最後一步(刷新目錄)。如果您不這樣做,電源故障可能會導致舊文件在重新啓動後重新出現。典型用途不用擔心這一步。