Почему я могу переименовать работающий исполняемый файл, но не удалить его?

12

Все есть в названии, но более официально:

Почему Windows позволяет мне переименовывать работающий исполняемый файл, но не удаляет его?

марко-fiset
источник

Ответы:

12

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

Дэвид Шварц
источник
2
Хм, почему тогда любая попытка переименовать обычный файл, который открыт для чтения или записи, терпит неудачу?
Серж
5
@Serge: потому что процесс, открывший файл, специально попросил его завершить с ошибкой, установив соответствующие флаги открытия.
Дэвид Шварц
какие конкретно открытые флаги?
n611x007
2
Скорее всего, установка dwShareModeна ноль или использование флагов OF_SHARE_COMPATили OF_SHARE_EXCLUSIVE.
Дэвид Шварц
6

Он не позволяет удалить исполняемый файл и библиотеки 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
саржа
источник
Обратите внимание, что, например, Linux также отображает части исполняемых файлов в память, но не имеет проблем, позволяя вам удалить работающий исполняемый файл.
ChrisInEdmonton
2
@ChrisInEdmonton Да, но это я объяснил здесь: unix.stackexchange.com/questions/49299/…
Серж,
Серж, там хорошее объяснение. :)
ChrisInEdmonton
Linux не позволит вам удалить файл во время его выполнения. Однако вы можете удалить записи каталога, поскольку они не выполняются.
Дэвид Шварц
@ DavidSchwartz, пожалуйста, смотрите обновление к моему ответу. Linux позволяет мне отсоединить любой исполняемый файл, если у меня достаточно прав для его удаления.
Серж
2

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

ppeterka
источник