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