3

ファイルが大規模に置き換えられ(同じ名前)、インプレースで変更されていないと仮定します(つまり、一時ファイルを作成してからファイル名に名前を変更します)。

カーネルはまだディスク上の古いファイル (inode) へのハンドルを持っているので、この変更はローカルの mmap には影響しないと思います。

ただし、NFS はステートレスであるため、mmap の (長い) 存続期間中に、mmap がすべて混乱し、古いファイルと新しいファイルの内容が混在することはありますか?

read/readv は、NFS マウントされたファイルを処理する唯一の安全な方法のようです。

4

1 に答える 1

6

ファイルへの開いている参照がある場合、その参照は、たとえファイル自体が削除されたり名前が変更されたりしても、その名前が後で新しいファイルによって再利用されたとしても、参照が存続する限り同じファイルを参照し続けます。それは削除されます。参照は、ファイル記述子またはメモリ マッピングにすることができます。これは POSIX の一部であり、使用されているファイルシステムの種類に関係なく、真実です (またはそうあるべきです!)。

つまり、NFS ファイルシステムでファイルを開いてメモリにマップすると、マップを解除しない限り、他のプロセス (または同じプロセス) が削除したとしても、そのメモリ マッピングを引き続き使用できます。ファイルを同じ名前の新しいファイルに置き換えます。

NFS プロトコルがステートレスであることは事実であるため、実装では、このケースが正しく処理されるように特別な手順を実行する必要があります。それがどのように行われたかを見てから非常に長い時間が経ちましたが、最後に (Solaris で) 行ったときは.nfsXXXXX、リンク数がゼロになった場合にファイルを削除するのではなく、ファイルの名前を特別な隠し名前 ( ) に変更することによって行われましたそれらへのオープンな参照がまだありました。とにかく、実装でどのようなトリックが使用されていても、ファイルシステムのユーザーとして心配する必要はありません。

于 2013-01-31T14:29:31.333 に答える