当前位置:  开发笔记 > 运维 > 正文

锁定执行文件:Windows,Linux没有.为什么?

如何解决《锁定执行文件:Windows,Linux没有.为什么?》经验,为你挑选了5个好方法。

我注意到在Windows上执行文件(.exe或.dll)时,它被锁定,无法删除,移动或修改.

另一方面,Linux不会锁定正在执行的文件,你可以删除,移动或修改它们.

当Linux没有时,为什么Windows会锁定?锁定有优势吗?



1> Oren Shemesh..:

Linux有一个引用计数机制,因此您可以在文件执行时删除该文件,只要某个进程(以前打开它)有一个打开的句柄,它就会继续存在.删除文件时,将删除该文件的目录条目,因此无法再打开该文件,但已使用该文件的进程仍可使用该文件.一旦使用此文件的所有进程终止,该文件将自动删除.

Windows没有此功能,因此强制锁定文件,直到从中执行的所有进程完成为止.

我相信Linux的行为更可取.可能有一些深层的体系结构原因,但我发现最引人注目的主要(和简单)原因是,在Windows中,您有时无法删除文件,您不知道为什么,而您所知道的只是某些进程将其保留在使用.在Linux中它永远不会发生.


支持Linux行为的一个实际原因是,您可以在系统运行时更新系统上的操作系统和其他软件,并且从不/很少重新启动(您甚至可以在不重新启动的情况下切换正在运行的内核,只需要调用它就足够困难了)适用于正常运行时间的应用程序).
Windows实际上有3位可以设置,它定义了另一个进程在文件打开时可以对文件执行的操作.如果设置了`FILE_SHARE_DELETE`位,则可以在文件打开时删除该文件.我不认为PE加载器(加载EXE和DLL)设置此位.句柄是引用计数,删除时文件在删除最后一个句柄时消失,但是它与Unix之间的区别在于NT会阻止在发生这种情况时使用相同名称创建新文件.
"Windows没有这种能力"......你确定吗?NT内核基于使用句柄和引用引用对象的引用.
请注意,您可以使用Windows中的Process Explorer之类的工具来查看使用文件/文件夹的进程.
comonad说的完全错误,NTFS当然使用Hardlinks并且总是这样,在Windows Vista中添加了符号链接.Windows不使用ref copunting也是完全错误的,它确实只是读取了像CreateFile这样的API,并且明确说明在哪种情况下文件是可删除的等等.这也是问题真正答案的正确位置:CreateFile有一个名为dwShareMode的参数,它控制已打开文件的强制锁定并允许应用程序决定.默认值是独占锁...

2> Neil William..:

据我所知,linux 在运行时锁定可执行文件 - 但是,它会锁定inode.这意味着你可以删除"文件",但inode仍然在文件系统上,不受影响,你真正删除的只是一个链接.

Unix程序一直使用这种思考文件系统的方式,创建一个临时文件,打开它,删除名称.您的文件仍然存在但名称已释放供其他人使用,其他任何人都无法看到它.


向谷歌询问"unix安全临时文件",你会发现足够的技术描述,以证明它是众所周知和常用的.虽然我没有任何具体的例子,但我敢说任何使用临时文件的安全意识的应用都会这样做.

3> 小智..:

Linux会锁定文件.如果您尝试覆盖正在执行的文件,您将获得"ETXTBUSY"(文本文件繁忙).但是,您可以删除该文件,并且内核将在删除最后一次引用时删除该文件.(如果机器没有干净地关闭,那么当检查文件系统时,这些文件是"删除的inode没有d时间"消息的原因,它们没有被完全删除,因为正在运行的进程有一个对它们的引用,现在他们是.)

这有一些主要优点,您可以升级正在运行的进程,删除可执行文件,替换它,然后重新启动进程.甚至可以像这样升级init,替换可执行文件,并向它发送一个信号,它将重新执行()本身,而无需重启.(这通常由您的包管理系统自动完成,作为其升级的一部分)

在Windows下,替换正在使用的文件似乎是一个主要的麻烦,通常需要重新启动以确保没有进程正在运行.

可能存在一些问题,例如,如果你有一个非常大的日志文件,你删除它,但忘记告诉正在登录该文件的进程重新打开文件,它将保留引用,你会想知道为什么你的磁盘没有突然获得更多的可用空间.

你也可以在linux下使用这个技巧来获取临时文件.打开文件,删除它,然后继续使用该文件.当您的进程退出时(无论出于何种原因 - 甚至出现电源故障),该文件将被删除.

像lsof和fuser这样的程序(或者只是在/ proc // fd中查找)可以显示哪些进程打开了不再具有名称的文件.



4> Eric Tuttlem..:

我认为linux/unix不使用相同的锁定机制,因为它们是作为多用户系统从头开始构建的 - 预计多个用户可能使用相同的文件,甚至可能用于不同的目的.

锁定有优势吗?好吧,它可能会减少操作系统必须管理的指针数量,但是现在一天的节省量几乎可以忽略不计.我能想到锁定的最大优点是:你保存了一些用户可见的歧义.如果用户a正在运行二进制文件,并且用户b删除它,那么实际文件必须坚持到用户A的进程完成为止.然而,如果用户B或任何其他用户在文件系统上查找它,他们将无法找到它 - 但它将继续占用空间.对我来说并不是一个真正的问题.

我认为这主要是关于向后兼容窗口文件系统的问题.



5> MSalters..:

我认为你对Windows太过绝对了.通常,它不会为可执行文件的代码部分分配交换空间.相反,它保持对可删除和DLL的锁定.如果再次需要丢弃代码页,则只需重新加载它们.但是使用/ SWAPRUN,这些页面将保持交换状态.这用于CD或网络驱动器上的可执行文件.因此,Windows不需要锁定这些文件.

对于.NET,请查看卷影副本.

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有