为什么我可以重命名正在运行的可执行文件,而不能删除它?


12

一切都在标题中,但更正式地:

Windows为什么让我重命名正在运行的可执行文件,而不删除它?

Answers:


12

确实没有重命名文件之类的事情。一个文件可以有多个名称,也可以没有名称,因此它不是您要重命名的文件,而是目录条目。重命名是对目录条目的一项操作,不受文件锁定执行的事实的影响。


2
嗯,为什么任何尝试重命名可以读取或写入的常规文件的尝试都会失败?
Serge 2012年

5
@Serge:因为打开文件的进程通过设置适当的打开标志专门要求其失败。
David Schwartz 2012年

具体开放哪些标志?
n611x007

2
很有可能设置dwShareMode为零或使用OF_SHARE_COMPATOF_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/…–
Serge

Serge,那里的解释很好。:)
ChrisInEdmonton 2012年

Linux不允许您在执行文件时删除文件。但是,您可以删除目录条目,因为它们没有执行。
大卫·史瓦兹

@DavidSchwartz,请参阅我的答案的更新。Linux允许我取消链接正在执行的任何文件,只要我有足够的权限删除该文件。
Serge 2012年

2

我猜这是因为名称只是文件相同二进制内容的属性,因此只要数据存在,运行进程为其持有的句柄就不会改变。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.