假设我有一个包含多个文本的文件,我尝试用代码读取它。假设读取文件需要 15 秒。当我的代码开始读取并在第 7 秒时另一个进程尝试保存或覆盖它。在这种情况下会发生什么?操作系统是否允许保存/覆盖它,如果是,我的阅读过程是否会有任何问题?
这取决于操作系统。每个操作系统都有不同的行为。
在 Windows 上,文件在打开时可以被锁定,程序必须选择它可以容忍的共享访问:读取、写入和/或删除重命名。该程序还可以锁定文件的一部分,这将暂时拒绝其他程序对该部分的访问。
在 Linux 上,共享访问是默认设置。文件锁是存在的,但它们通常只能阻止其他锁——而不是没有锁的直接读取或写入。强制锁(确实阻止读取和写入的锁)可能会在文件系统上被禁用 - 它们会减慢所有文件访问速度。删除和重命名根本不被视为文件访问(它们被视为对父目录的写入)。删除后,打开该文件的程序仍可访问该文件,但文件关闭后该文件将永久消失。
一般来说,读取和写入不是原子的,读取可以看到写入数据和原始数据的某种组合。例如,如果文件包含
123
并且某人写入 ABC
,则读取应该期望 123
、ABC
、1B3
、A2C
和一些类似的选项(但不是 123ABC
、) BC1
,或类似 - 无需重新排列位置)。