mv
私のfs(ext4)がアトミックであることをどのように確認できますか?
オペレーティングシステムはRed Hat Enterprise Linux Serverバージョン6.8です。
一般的にこれをどのように確認しますか?私は周りを見回しましたが、私のOSが標準POSIXであるかどうかが見つかりませんでした。
答え1
興味深いことに、答えは「状況によって異なります」ようです。
確かに、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
動作は実装に応じて定義されます。商品を返す
この関数は、操作が成功した場合は0を返し
rename
、失敗した場合は0以外の値を返します。この場合、ファイルが以前に存在していた場合は、元の名前で識別できます。
驚くべきことに、原子性に対する明示的な要件はない。最新の公開C規格の他の場所で必要になる可能性がありますが、まだ見つかりませんでした。誰もがそのようなニーズを見つけることができれば、編集とコメントを歓迎します。
また、見ることができますrename() は原子的ですか?
すべてLinuxのマニュアルページ:
すでに存在する場合は、
newpath
そのアイテムにアクセスしようとしている他のプロセスで見つからないアイテムが見つからないように自動的に置き換えられますnewpath
。ただし、名前が変更されたファイルを参照するウィンドウが表示されることoldpath
があります。newpath
Linuxのマニュアルページの主張代替ファイルの内容はアトミックです。
テストそして確認するただし、これを行う必要がある場合、原子性は非常に困難になる可能性があります。 「mvが原子であることを確認する方法」が何を意味するのかは明らかではありません。原子性の要件/仕様/文書化が必要ですか、それとも実際に必要ですか?テストそれ?
上記の内容も参考にしてください仮説両方のオペランドのファイル名は同じファイルシステムにあります。mv
これを行うユーティリティの標準的な制限が見つかりません。
答え2
mv
rename
システムコールと原子性に基づいていますrename()
。マンページを見ることができますrename(2)
。
あなたは答えを見つけることができますrename() は原子的ですか?スタックオーバーフローに。
どのタイプのfsを使用していますか?
答え3
おそらく、システムコールとその原子性を確認することに加えてテストかもしれませんが、inotify-tools
これが原子性の保証された証拠であるかどうかはわかりません。
2つの殻を開きます。次のいずれかで移動されたターゲットディレクトリを観察します。
inotifywait -m target/
ファイルを別のディレクトリに移動します。
mv foobar target/
1行だけを表示する必要がありますinotifywait
。
target/ MOVED_TO foobar
ls target/
の応答と比較するとtouch target/a
原子的なものに見え、次のような複数行のメッセージを生成します。
# the response to ls target/
target/ OPEN,ISDIR
target/ ACCESS,ISDIR
target/ CLOSE_NOWRITE,CLOSE,ISDIR
ポリスチレン
私の考えは、少なくともファイルに対する非同期マルチプロセス協力が安全であることを示していますinotify
(実際には原子的)。とにかく、inotify
操作後に最終信号を送信した後にのみ応答します。たとえば、生産者 - 消費者設定は、次の方法をinotify
使用して簡単かつ安全に実装できます。