据我观察,当某个文件(比如 pdf)以只读方式打开时,Windows 会“锁定”该文件并阻止访问(比如写入和删除/删除访问)。
这实际上是如何在底层实现的?这与 Linux 处理文件/文件系统的方式类似吗?希望有人能指出一些方向/给出一些有用的关键字。(谷歌搜索没有太大帮助)
答案1
这是实际上称为“文件锁定”,当它可以阻止实际的读取或写入操作时,具体称为“强制锁定”。
(另一种类型是咨询锁定,其中协作进程必须在继续之前明确检查是否持有锁,但非协作进程仍可以在任何它喜欢的地方写入。)
甚至更多的具体来说,您说的是 Windows 的一项功能,称为“共享模式”,这是它在 MS-DOS 时代从 LAN Manager 继承的功能(即当时 PC 软件在编写时没有考虑并发性,但仍然必须以某种方式安全地访问常见的 SMB 文件共享)。您可以看到它记录在这里作为 CreateFile() API 的参数。更多注释这里。
共享模式只是强制锁定的一个特例。由于其历史渊源,shareMode 标志是相反的,必须提供给允许并发读取或写入(与典型的文件锁定 API 相比,它们是“可选的”并且暂时否定并发访问(否则将被允许),但它仍然以基本相同的方式工作。
这与 Linux 处理文件/文件系统的方式类似吗?
大多情况下不是。Linux 没有与“共享模式”等同的模式(默认情况下允许所有访问),并且它甚至不支持强制锁定。¹
但是Linux确实有咨询锁定,即只影响明确调用锁定函数(例如 flock() 或 fcntl())的程序的类型,并且许多程序每天都使用它来协调例如 SQLite 数据库写入(查看的输出sudo lslocks
)。
¹(以前,Linux 确实具有强制锁定作为隐藏的、默认禁用的功能,但它被认为基本上不可用,并最终在 Linux 5.15 中被删除。启用此功能将允许程序使用相同的 flock() 完全阻止其他进程打开同一文件进行读取或写入 - 有点类似于 Windows 中的共享标志的工作方式,尽管仍然是选择加入而不是选择退出。)