windows - 如何使 Windows 文件锁定更像 UNIX 文件锁定?

标签 windows unix

UNIX 文件锁定非常简单:操作系统假定您知道自己在做什么并让您做您想做的事:

例如,如果您尝试删除另一个进程已打开的文件,操作系统通常会让您这样做。原始进程仍然保留它的文件句柄直到它终止——此时文件系统将悄悄地重新循环磁盘资源。别大惊小怪,这就是我喜欢的方式。

Windows 上的情况有何不同:如果我尝试删除另一个进程正在使用的文件,我会收到操作系统错误。在原始进程释放它对该文件的锁定之前,该文件是不可访问的。这在 MS-DOS 的单用户时代非常棒,当时任何锁定进程都可能在包含文件的同一台计算机上,但在网络上这是一场噩梦:

考虑当进程在写入 Windows 文件服务器上的共享文件时挂起时会发生什么。在删除文件之前,我们必须找到计算机并识别最初打开该文件的计算机上的进程。只有这样我们才能终止进程并删除不需要的文件。

真讨厌!

有没有办法让它变得更好?我想要的是让 Windows 上的文件锁定表现得像 UNIX 中的文件锁定。我希望操作系统只让我做我想做的事,因为我负责并且我知道我在做什么...

...那么可以吗?

最佳答案

没有。 Windows 是为“普通用户”设计的,即对计算机一无所知的人。因此,操作系统试图聪明地避免 PEBKAC秒。引用比尔·盖茨的话:“Windows 没有任何人想要解决的问题。”当然,他知道 99.9999% 的 Windows 用户无法判断该程序是否因为他们或编写它的人做了一些奇怪的事情。

Unix 是在世界更加简单的时候设计的,任何人只要离计算机足够近就可以触摸它,都可能知道如何用脏沙子组装它。因此,操作系统通常会让你做你想做的事,因为它假定你知道得更多(如果你不知道,下次你就会知道)。

技术答案:如果您创建文件,Unix 会分配一个“i-nodes”。 I 节点可以在进程之间共享。如果两个进程创建相同的文件(即,两个进程使用相同的路径调用 create()),那么您最终会得到两个 inode 。这是设计使然。它允许一个奇特的安全功能:您可以创建只有您自己才能打开的文件:

  1. 打开一个文件
  2. 删除它(但保留文件句柄)
  3. 随心所欲地使用文件
  4. 关闭文件

在步骤#2 之后,宇宙中唯一可以访问该文件的进程就是创建它的进程(除非您想逐 block 读取硬盘)。操作系统将使数据保持事件状态,直到您关闭文件或您的进程终止(此时 Unix 将在您之后清理)。

这种设计是所有 Unix 文件系统的基础。 Windows 文件系统 NTFS 的工作方式大致相同,但高级 API 不同。许多应用程序以独占模式打开文件(这会阻止任何人,甚至备份程序)读取文件。甚至对于像 PDF 查看器这样只显示信息的应用程序也是如此。

这意味着您必须修复所有 Windows 应用程序才能达到预期效果。如果您有权访问源,则可以在共享模式下创建文件。这将允许其他进程同时访问它,但是随后,您必须在每次读/写之前检查文件是否仍然存在,是否有人进行了更改等。

关于windows - 如何使 Windows 文件锁定更像 UNIX 文件锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/546504/

相关文章:

unix - unix 机器上的缓存内存不断增长

linux - 有没有一种检测陈旧的 NFS 挂载的好方法

java - 从正在运行的 java 程序的内存中定位并读取特定类型的对象

linux - svn:此平台不支持符号链接(symbolic link) - Windows 8.1

javascript - 如何将 asp.net 3.5 文本框输入到 JavaScript 中?

python - 无法在 Win7 上将 python.exe 设置为 *.py 脚本

bash - 无法运行 tar 命令 - 无效选项 -- '▒'

linux - 从路径中提取最后一个斜杠的文件名

c++ - 明GW “The procedure entry point libintl_setlocale could not be located …”

java - 裁剪 BufferedImage 以在 Xuggle 编码视频中使用