18

Когда я пытаюсь перезаписать бинарный файл, который запущен в данный момент, 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

Есть идеи почему?

1 ответ1

41

В первом случае вы пытаетесь перезаписать содержимое файла, который в данный момент работает как программа. Linux не позволяет этого - если бы это было так, вы бы перезаписали код прямо в тот момент, когда его выполняла ОС; первое отличие может привести к сбою программы или к ее неисправности.

Но во втором случае вы фактически не изменяете содержимое старого файла - вы создаете новый файл вместо него, а старый просто теряет имя файла, но сохраняет его содержимое без изменений.

(Помните, что rm технически не удаляет файлы, он просто удаляет ссылки на каталоги - подобно тому, как ln добавляет больше ссылок на тот же файл. Только когда файл не имеет ссылок и открытых ссылок на файлы, он автоматически удаляется.)

Система ссылается на используемые файлы по их иноду, поэтому не имеет значения, что они имеют одинаковое имя файла - это все еще старый файл, который остается открытым системой, и даже если у него больше нет ссылок, он будет только удален как только все программы закроют его.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .