Posix

mv 在我的 fs 上是原子的嗎?

  • June 10, 2019

如何檢查mv我的 fs (ext4) 上是否是原子的?

作業系統是 Red Hat Enterprise Linux Server 6.8 版。

一般來說,我該如何檢查?我環顧四周,沒有發現我的作業系統是否是標準 POSIX。

有趣的是,答案似乎是“視情況而定”。

為了清楚起見,mv指定

mv實用程序應執行與rename() 功能等效的操作

命名函式規範指出:

對於正常文件,此rename()功能等效於 ISO C 標准定義的功能。它在這裡的包含擴展了該定義以包括對目錄的操作,並指定新參數命名已存在的文件時的行為。該規範要求函式的操作是原子的。

但最新的 ISO C國家規範rename()

7.21.4.2rename功能

概要

#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強制執行該實用程序的標準限制。

引用自:https://unix.stackexchange.com/questions/322038