現在起動しているバイナリファイルを上書きしようとすると、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
なぜか?
最初のケースでは、プログラムとして現在実行中であるファイルの内容を上書きしようとしています。 Linuxはそれを許可していません–許可した場合、OSが実行していたとおりにコードを上書きします。最初の違いは、プログラムをクラッシュさせるか、誤動作させます。
ただし、2番目のケースでは、古いファイルの内容を実際に変更するのではなく、代わりにnewファイルを作成しますが、古いファイルはファイル名を失うだけで、その内容は変更されません。
(rm
は技術的にファイルを削除しないことに注意してください。これは、ln
が同じファイルにリンクを追加する方法と同様に、ディレクトリリンクを削除するだけです。ファイルがリンクはありませんおよび開いているファイル参照はありません。自動的に削除されます。)
システムは使用中のファイルをiノードで参照するため、ファイル名が同じであっても問題ありません。リンクがなくても、システムはoldファイルのままです。もはや、すべてのプログラムがそれを閉じて初めて削除されます。