Windowsがファイルが現在使用されていると文句を言う場所で、ファイルを削除/置換できるLinuxの異なる動作は何ですか?


29

私が持っている例はMinecraftです。LinuxでBukkitを実行する場合、/ pluginsフォルダー内の.jarファイルを削除または更新し、単に「reload」コマンドを実行できます。

Windowsでは、削除または置換しようとすると.jarファイルが現在使用されていると文句を言うので、サーバープロセス全体を停止する必要があります。

これは私にとって素晴らしいですが、なぜそれが起こるのですか?ここでLinuxはどう違うのですか?

回答:


34

Linuxは、Windowsとはまったく異なる方法でファイルを削除します。最初に、* unixネイティブファイルシステムでのファイルの管理方法について簡単に説明します。

ファイルは、と呼ばれるマルチレベル構造でディスクに保持されますi-node。各iノードには、単一のファイルシステム上で一意の番号があります。iノード構造は、ファイルのサイズ、ファイルに割り当てられたデータブロックなど、ファイルに関するさまざまな情報を保持しますが、この答えのために最も重要なデータ要素はlink counterです。directoriesファイルについてのレコードを保持するファイルです。各レコードには、参照するiノード番号、ファイル名の長さ、およびファイル名自体があります。このスキームにより、「ポインタ」、つまり、異なる名前の異なる場所にある同じファイルへの「リンク」を持つことができます。iノードのリンクカウンターは、実際にこのiノードを参照するリンクの数を保持します。

何らかのプロセスがファイルを開くとどうなりますか?最初に、open()関数はファイルレコードを検索します。次に、このiノードのメモリ内iノード構造が既に存在するかどうかを確認します。これは、一部のアプリケーションが既にこのファイルを開いている場合に発生する可能性があります。それ以外の場合、システムは新しいメモリ内iノード構造を初期化します。次に、システムはメモリ内のiノード構造のオープンカウンターを増やし、ファイル記述子をアプリケーションに返します。

ファイルを削除するためのLinuxライブラリ呼び出しはと呼ばれunlinkます。この関数は、ディレクトリからファイルレコードを削除し、iノードのリンクカウンターをデクリメントします。システムがメモリ内のiノード構造が存在し、そのオープンカウンターがゼロでないことを検出した場合、この呼び出しはアプリケーションに制御を返します。それ以外の場合、リンクカウンターがゼロになったかどうかをチェックし、ゼロになった場合、システムはiノードとiノード自体に割り当てられたすべてのブロックを解放し、アプリケーションに戻ります。

アプリケーションがファイルを閉じるとどうなりますか?この関数close()は、オープンカウンターをデクリメントし、その値をチェックします。値がゼロ以外の場合、関数はアプリケーションに戻ります。それ以外の場合、iノードリンクカウンターがゼロかどうかをチェックします。ゼロの場合、ファイルとiノードのすべてのブロックを解放してから、アプリケーションに戻ります。

このメカニズムにより、開いているファイルを「削除」できます。同時に、ファイルを開いたアプリケーションは、ファイル内のデータに引き続きアクセスできます。したがって、JREは、あなたの例では、ディスク上に別の更新されたバージョンが存在する間、ファイルのバージョンを開いたままにします。

さらに、この機能を使用すると、通常の操作を中断することなく、システム内のglibc(libc)(すべてのアプリケーションのコアライブラリ)を更新できます。

20年前、DOSでFAT以外のファイルシステムを知りませんでした。このファイルシステムには、異なる構造と管理原則があります。これらの原則では、ファイルを開いたときにファイルを削除することはできません。そのため、DOSおよび最近のWindowsは、開いているファイルの削除要求を拒否する必要があります。おそらくNTFSは* nixファイルシステムと同じ動作を許可しますが、Microsoftはファイル削除の習慣的な動作を維持することを決定しました。

これが答えです。短くはありませんが、今ではアイデアがあります。

編集Win32混乱の原因に関する良い読み物:https : //blogs.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993 @Jonへのクレジット


1
サーバーの実行中にプラグインファイルの名前を変更しようとしました:i.imgur.com/xibyF.png
MetaGuru

cmdウィンドウを開き、このディレクトリに移動して使用しますren MonsterB.jar MonsterB.ja_-動作するはずです。dllファイルとexeファイルで確実に機能します。
セルジュ

1
いいえ、Windowsはメモリに実行可能ファイルの部分をマップ
セルジュ

9
NTFSは実際にサポートしていますが、Cライブラリfopenコマンドはフラグを指定CreateFileして呼び出しているFILE_SHARE_DELETEため、ファイルを開くほとんどのプログラムでは許可されません。
Random832

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.