讀取正在使用寫入時複製修改的檔案的最佳方法是什麼?

讀取正在使用寫入時複製修改的檔案的最佳方法是什麼?

我們有一個包含始終需要保持一致的資料的檔案。當需要修改時,Process 1建立一個新文件,將修改寫入新文件,並使用mv將新文件重新命名為舊文件名稱。

如果我們有另一個進程Process 2需要讀取這個文件,我們如何保證它總是讀取一致的文件,即讀取過程中mv的 byProcess 1不會導致資料損壞?

答案1

您可以透過在與舊檔案相同的檔案系統上建立新檔案並使用rename(2)保證是原子的 [1] 函數來保證這一點。

在Unix檔案系統上,arename(2)僅作用於目錄條目,它不會影響任何對原始目錄條目所指向的inode有開啟句柄的進程;該進程將繼續讀取或寫入舊檔案。

通常,該mv(1)實用程式只會調用rename(2),但在失敗的情況下,它可能會回退到刪除+複製或其他可疑的非原子操作rename(2)

請注意,同一檔案系統上的兩個檔案可能無法保證 arename(2)會成功 - 有些檔案系統9pfs不支援重命名操作,因此必須以某種方式製造它。

[1] 甚至更好,renameat(2)這可以防止檔案的主要路徑被另一個進程秘密更改,即「符號連結攻擊」。

相關內容