49

実験でこれを確認できず、マニュアルページからも収集できませんでした。

2 つのプロセスがあるとします。1 つは file1 を directory1 から directory2 に移動 (名前変更) します。同時に実行されている他のプロセスが directory1 と directory2 の内容を別の場所にコピーするとします。directory1 と directory2 の両方が file1 を表示するような方法でコピーが行われる可能性はありますか? つまり、最初のプロセスによって移動前に directory1 がコピーされ、移動後に directory2 がコピーされます。

基本的に rename() はアトミック システム コールですか?

ありがとう

4

4 に答える 4

29

はいといいえ。

rename() は、OS がクラッシュしないことを前提としてアトミックです。他のファイルシステム操作によって分割することはできません。

システムがクラッシュした場合、代わりに ln() 操作が表示されることがあります。

また、ネットワーク ファイルシステムで操作している場合、操作が成功すると ENOENT が返される可能性があることに注意してください。ローカルファイルシステムではそれができません。

于 2011-08-14T03:41:20.820 に答える
25

これは非常に遅い答えですが...はいrename()、アトミックですが、質問の意味ではありません。Linux では、 次のようにrename(2)述べています。

ただし、上書きすると、oldpath と newpath の両方が名前変更中のファイルを参照するウィンドウが表示される可能性があります。

しかしrename()、非常に重要な意味でアトミックであることには変わりありません。それを使用してファイルを上書きすると、最終的には古いバージョンか新しいバージョンのどちらかだけになるだけです。

[更新:ただし、@jonas-wielicki がコメントで指摘しているように、名前を変更するファイルに実際に最新の内容が含まれていることを確認する必要がありますfsync()

newpath がすでに存在する場合、それは自動的に置き換えられます (いくつかの条件に従います。以下のエラーを参照してください)。そのため、newpath にアクセスしようとする別のプロセスがそれを見つけられない点はありません。

ERRORS が表示された場合、名前の変更に失敗する可能性がありますが、アトミック性が損なわれることはありません。

これはすべて Linux の man ページからのものです。私が知らないのはrename()、サーバーが別の OS を実行しているネットワーク ファイル システムで実行するかどうかです。その場合、クライアントはアトミック性を保証する地獄に希望を持っていますか? 疑わしい。

于 2014-04-02T21:11:33.893 に答える
7

あなたの質問の「基本的に」の部分が有効かどうかはわかりません。この 2 つの間になんらかの同期がない限り、アトミックな名前変更がいかに重要であるかは問題ではありません。名前を変更する前にディレクトリのコピーがそこにある場合は、両方の場所に file1 があります。

スレッドまたはプロセスのどちらを意味しているのかはわかりませんが、両方のロックメカニズムがある場合、スレッドロックはプロセスの境界を越える必要がないため、はるかに簡単です。

于 2011-08-14T04:02:34.247 に答える