我注意到在Windows上执行文件(.exe或.dll)时,它会被锁定,无法删除、移动或修改。
而Linux则不会锁定正在执行的文件,您可以删除、移动或修改它们。
为什么Windows要锁定而Linux不用呢?锁定有什么好处吗?
我注意到在Windows上执行文件(.exe或.dll)时,它会被锁定,无法删除、移动或修改。
而Linux则不会锁定正在执行的文件,您可以删除、移动或修改它们。
为什么Windows要锁定而Linux不用呢?锁定有什么好处吗?
Linux拥有引用计数机制,因此您可以在文件正在执行时删除它,并且只要某些进程(先前打开它的进程)仍然保留了对它的打开句柄,它就会继续存在。删除文件时,该文件的目录条目被移除,因此无法再次打开它,但已经使用此文件的进程仍然可以使用它。一旦所有使用此文件的进程终止,该文件将自动删除。
Windows没有这种功能,因此它被迫锁定该文件,直到所有从中执行的进程都已完成。
我认为Linux的行为更可取。可能存在一些深层次的架构原因,但我发现最具说服力的主要(简单)原因是,在Windows中,有时不能删除文件,您不知道为什么,只知道某个进程正在使用它。而在Linux中,永远不会出现这种情况。
Linux会锁定文件。如果你试图覆盖正在执行的文件,你将会得到“ETXTBUSY”(文本文件忙)错误。但是你可以删除该文件,并且当最后一个对它的引用被移除时,内核将删除该文件。(如果机器没有干净地关闭,则这些文件是当检查文件系统时产生“已删除的i节点具有零d时间”消息的原因。它们没有完全被删除,因为运行的进程仍在引用它们,现在他们是。)
这样做有一些重要的优点,您可以通过删除可执行文件、替换它然后重新启动进程来升级正在运行的进程。甚至init也可以像这样升级,替换可执行文件,发送一个信号,它就会重新exec ()自身,而无需重新启动。(这通常由软件包管理系统自动完成作为其升级的一部分)
在Windows下,替换正在使用的文件似乎是一个很大的麻烦,通常需要重新启动以确保没有正在运行的进程。
可能会出现一些问题,例如,如果你有一个非常大的日志文件,并删除了它,但忘记告诉正在记录该文件的进程重新打开该文件,它将继续保持引用,你会想知道为什么你的磁盘没有突然获得更多的可用空间。
你也可以在Linux下使用这个技巧来处理临时文件。打开文件,删除它,然后继续使用该文件。当你的进程退出(无论出于什么原因——甚至是电源故障),该文件将被删除。
像lsof和fuser这样的程序(或者只是在/proc//fd中四处查看)可以向你展示哪些进程打开了没有名称的文件。
dwShareMode
参数。这就是为什么你可能无法删除某些应用程序正在使用的文件的原因,因为它根本不关心你的用例,使用了默认值,因此被Windows锁定了一个文件。当运行时,可执行文件会逐步映射到内存中。这意味着只有在需要时才会加载可执行文件的部分。如果在所有部分被映射之前将文件交换出去,可能会导致严重的不稳定性。
NT变体有
openfiles
命令,它将显示哪些进程在哪些文件上具有句柄。但是,它需要启用系统全局标志“维护对象列表”。
openfiles /local /?
告诉您如何执行此操作,并且还会因此产生性能损失。