Все есть в названии, но более официально:
Почему Windows позволяет мне переименовывать работающий исполняемый файл, но не удаляет его?
Там действительно нет такой вещи, как переименование файла. Файл может иметь более одного имени или не иметь имени, поэтому вы переименовываете не файл, а запись каталога. Переименование - это операция над записью каталога, на которую не влияет тот факт, что файл заблокирован для выполнения.
Он не позволяет удалять исполняемый файл и библиотеки DLL, потому что Windows отображает части исполняемых файлов в память как часть процесса создания, поэтому он нуждается в файле в течение всего жизненного цикла процесса.
К сожалению, у меня нет истинной причины, почему он все еще позволяет переименовывать такие файлы. Я предполагаю, что это сделано для того, чтобы разрешить обновление dll и exe-файлов во время их работы, чтобы минимизировать время прерывания обслуживания.
В отличие от Linux (Unix в целом) позволяет удалить исполняемый файл во время его работы:
tmp]$ cp /usr/bin/md5sum .;ll md5*; \
(./md5sum /home/pub/iso/FC5/FC-5-i386-DVD.iso & ); \
rm md5sum ; ll md5*;ps -f
-rwxr-xr-x 1 sergey sergey 37276 Oct 16 02:38 md5sum
ls: cannot access md5*: No such file or directory
UID PID PPID C STIME TTY TIME CMD
sergey 2423 2422 0 02:32 pts/1 00:00:00 -bash
sergey 2533 1 0 02:38 pts/1 00:00:00 ./md5sum /home/pub/iso/FC5/FC-5-
sergey 2536 2423 0 02:38 pts/1 00:00:00 ps -f
Я предполагаю, что это потому, что имя - это просто атрибут того же двоичного содержимого файла, поэтому, пока есть данные, дескриптор, удерживаемый запущенным процессом, не изменится.