mv 在我的 fs 上是原子的嗎?
如何檢查
mv
我的 fs (ext4) 上是否是原子的?作業系統是 Red Hat Enterprise Linux Server 6.8 版。
一般來說,我該如何檢查?我環顧四周,沒有發現我的作業系統是否是標準 POSIX。
有趣的是,答案似乎是“視情況而定”。
為了清楚起見,
mv
指定為
mv
實用程序應執行與rename()
功能等效的操作重命名函式規範指出:
對於正常文件,此
rename()
功能等效於 ISO C 標准定義的功能。它在這裡的包含擴展了該定義以包括對目錄的操作,並指定新參數命名已存在的文件時的行為。該規範要求函式的操作是原子的。但最新的 ISO C國家規範
rename()
:7.21.4.2
rename
功能概要
#include <stdio.h> int rename(const char *old, const char *new);
描述
該
rename
函式使名稱為 所指向的字元串的文件old
從此以 所指向的字元串給出的名稱為人所知new
。命名的文件old
不再可以通過該名稱訪問。new
如果在呼叫函式之前存在由 指向的字元串命名的文件rename
,則行為是實現定義的。退貨
如果操作成功,該
rename
函式返回零,如果失敗,則返回非零,在這種情況下,如果文件以前存在,它仍然以其原始名稱為人所知。令人驚訝的是,請注意對原子性沒有明確的要求。在最新的公開可用的 C 標準中的其他地方可能需要它,但我一直無法找到它。如果有人能找到這樣的要求,我們非常歡迎編輯和評論。
另請參閱rename() 是原子的嗎?
根據Linux 手冊頁:
如果
newpath
已經存在,它將被原子替換,這樣另一個嘗試訪問的程序就newpath
不會發現它失去了。但是,可能會有一個視窗,其中oldpath
和都newpath
引用被重命名的文件。Linux 手冊頁聲稱文件的替換將是原子的。
但是,如果您需要走多遠,那麼測試和驗證原子性可能非常困難。您不清楚使用“如何檢查 mv 是否是原子的”是什麼意思。您想要它是原子的需求/規範/文件,還是需要實際測試它?
還要注意,上面假設兩個操作數文件名在同一個文件系統中。我找不到
mv
強制執行該實用程序的標準限制。