web-dev-qa-db-ja.com

cp overwrite vs rm then cp

現在起動しているバイナリファイルを上書きしようとすると、cpは上書きに失敗しますが、rmしてからcpを実行することは可能です。例えば:

user@poste:~$ cp binaryFile /tmp
user@poste:~$ Sudo cp /tmp/binaryFile binaryFile 
[Sudo] password for user:
cp: cannot create regular file `binaryFile`: Text file busy
user@poste:~$ Sudo rm binaryFile 
user@poste:~$ Sudo cp /tmp/binaryFile  binaryFile 
user@poste:~$ file binaryFile 
binaryFile : ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x7ce005d9eb50e2574246b6a881e625802f7e49f2, not stripped

なぜか?

18
M4rty

最初のケースでは、プログラムとして現在実行中であるファイルの内容を上書きしようとしています。 Linuxはそれを許可していません–許可した場合、OSが実行していたとおりにコードを上書きします。最初の違いは、プログラムをクラッシュさせるか、誤動作させます。

ただし、2番目のケースでは、古いファイルの内容を実際に変更するのではなく、代わりにnewファイルを作成しますが、古いファイルはファイル名を失うだけで、その内容は変更されません。

rm技術的にファイルを削除しないことに注意してください。これは、lnが同じファイルにリンクを追加する方法と同様に、ディレクトリリンクを削除するだけです。ファイルがリンクはありませんおよび開いているファイル参照はありません。自動的に削除されます。)

システムは使用中のファイルをiノードで参照するため、ファイル名が同じであっても問題ありません。リンクがなくても、システムはoldファイルのままです。もはや、すべてのプログラムがそれを閉じて初めて削除されます。

41
user1686