我們有一個包含始終需要保持一致的資料的檔案。當需要修改時,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)
這可以防止檔案的主要路徑被另一個進程秘密更改,即「符號連結攻擊」。