web-dev-qa-db-ja.com

私のfsはmvアトミックですか?

mvがfs(ext4)でアトミックかどうかを確認するにはどうすればよいですか?

OSはRed Hat Enterprise Linux Serverリリース6.8です。

一般的に、これを確認するにはどうすればよいですか?私は周りを見回しましたが、私のOSが標準のPOSIXであるかどうかはわかりませんでした。

13
Tizianoreica

興味深いことに、答えは「場合によって異なります」のようです。

明確にするために、 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標準のどこかで必要になるかもしれませんが、私はそれを見つけることができませんでした。誰かがそのような要件を見つけることができるなら、編集とコメントは大歓迎です。

参照 rename()はアトミックか?

Linux manページ

newpathがすでに存在する場合、それはアトミックに置き換えられるため、newpathにアクセスしようとする別のプロセスが欠落しているのを見つけることはありません。ただし、名前が変更されるファイルをoldpathnewpathの両方が参照するウィンドウが表示される可能性があります。

Linuxのmanページでは、ファイルの置換はアトミックであると主張しています。

テスト検証ただし、原子性は非常に難しいかもしれませんが、それがどれだけ必要かはわかりません。 「mvがアトミックかどうかを確認するにはどうすればよいですか」の使用における意味が明確ではありません。アトミックな要件/仕様/ドキュメントが必要ですか、それとも実際にテストする必要がありますか?

また、上記のは、2つのオペランドファイル名が同じファイルシステムにあることを前提としていますmvユーティリティを強制するための標準的な制限はありません。

9
Andrew Henle

mvrenameシステムコールに基づいており、rename()はアトミックです。マンページrename(2)をご覧ください。

Stackoverflowの Is rename()Atomic? で答えを見つけることができます。

どのようなfsを使いましたか?

0
xtrmz