При попытке перезаписи двоичного файла , который в настоящее время запущен, 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 не позволяет этого - если бы это было так, вы бы перезаписали код прямо в тот момент, когда его выполняла ОС; первое отличие может привести к сбою программы или к ее неисправности.
Но во втором случае вы фактически не изменяете содержимое старого файла - вы создаете новый файл на его месте, в то время как старый просто теряет имя файла, но сохраняет его содержимое без изменений.
(Помните, что технически
rm
не удаляются файлы, он просто удаляет ссылки на каталоги - подобно тому, как добавляет больше ссылок на тот же файл. Только когда у файла нет ссылок и нет ссылок на открытый файл, он автоматически удаляется.)ln
Система ссылается на используемые файлы по их иноду, поэтому не имеет значения, что они имеют одинаковое имя файла - это все еще старый файл, который остается открытым системой, и даже если у него больше нет ссылок, он будет только удален как только все программы закроют его.
источник
/proc/*/fd
для доступа к нему и, при необходимости, linkat () для добавления новой ссылки в файловую систему.linkat()
за соображений безопасности . (Исключение из этого правила: если оно не было создано сopen(O_TMPFILE)
тем, чтобы оно начиналось с нулевых ссылок.) Если вы попытаетесь,linkat()
возвращает ENOENT, даже как root. Посмотрите мой ответ на этот вопрос о том, как на самом деле запустить Perl-скрипт,linkat
и докажите, что он не работает, даже с правами root: /