mv
がfs(ext4)でアトミックかどうかを確認するにはどうすればよいですか?
OSはRed Hat Enterprise Linux Serverリリース6.8です。
一般的に、これを確認するにはどうすればよいですか?私は周りを見回しましたが、私のOSが標準のPOSIXであるかどうかはわかりませんでした。
興味深いことに、答えは「場合によって異なります」のようです。
明確にするために、 mv
が指定されている to
mv
ユーティリティはrename()
関数と同等のアクションを実行します
rename function specification の状態:
この
rename()
関数は、通常のファイルの場合、ISO C標準で定義されているものと同等です。ここに含めると、その定義が拡張されてディレクトリに対するアクションが含まれ、新しいパラメータが既存のファイルに名前を付けたときの動作が指定されます。 この仕様では、関数のアクションがアトミックである必要があります。
しかし、rename()
の最新の ISO C仕様 は次のように述べています。
7.21.4.2
rename
関数概要
#include <stdio.h> int rename(const char *old, const char *new);
説明
rename
関数を使用すると、old
が指す文字列が名前であるファイルが、new
が指す文字列が示す名前で認識されます。old
という名前のファイルは、その名前ではアクセスできなくなりました。new
関数が呼び出される前に、rename
が指す文字列で指定されたファイルが存在する場合、動作は実装定義です。返品
rename
関数は、操作が成功した場合はゼロを返し、操作が失敗した場合はゼロ以外を返します。この場合、ファイルが以前に存在していた場合でも、元の名前で認識されます。
驚くべきことに、原子性の明示的な要件はないことに注意してください。最新の公に利用可能なC標準のどこかで必要になるかもしれませんが、私はそれを見つけることができませんでした。誰かがそのような要件を見つけることができるなら、編集とコメントは大歓迎です。
newpath
がすでに存在する場合、それはアトミックに置き換えられるため、newpath
にアクセスしようとする別のプロセスが欠落しているのを見つけることはありません。ただし、名前が変更されるファイルをoldpath
とnewpath
の両方が参照するウィンドウが表示される可能性があります。
Linuxのmanページでは、ファイルの置換はアトミックであると主張しています。
テストと検証ただし、原子性は非常に難しいかもしれませんが、それがどれだけ必要かはわかりません。 「mvがアトミックかどうかを確認するにはどうすればよいですか」の使用における意味が明確ではありません。アトミックな要件/仕様/ドキュメントが必要ですか、それとも実際にテストする必要がありますか?
また、上記のは、2つのオペランドファイル名が同じファイルシステムにあることを前提としています。 mv
ユーティリティを強制するための標準的な制限はありません。
mv
はrename
システムコールに基づいており、rename()
はアトミックです。マンページrename(2)
をご覧ください。
Stackoverflowの Is rename()Atomic? で答えを見つけることができます。
どのようなfsを使いましたか?