在文件被覆盖的情况下读取文件会发生什么?

Lev*_*ven 30 files

假设我读取 (cat) 一个文件,而另一个进程正在重写其内容。输出是否可预测?会发生什么?

Gil*_*il' 24

这要看作者是做什么的。

如果作者覆盖了现有文件,那么当作者超过读者时读者将看到新内容(如果有的话)。如果作者和读者以可变速度前进,则读者可能会交替看到旧内容和新内容。

如果写入器在开始写入之前截断文件,则读取器将在该点对文件末尾运行。

如果作者创建了一个新文件,然后将新文件移动到旧名称,则读者将继续从旧文件中读取。如果移动或删除打开的文件,则打开该文件的进程会继续从同一文件中读取。如果文件被删除,它实际上会保留在磁盘上(但无法再次打开它),直到最后一个进程将其关闭。

Unix 系统往往没有强制。如果应用程序想要确保它的写入器组件和它的读取器组件不会相互干扰,则由开发人员来使用正确的锁定。在一些例外情况下,内核打开的文件可能会受到用户应用程序的写入保护,例如循环挂载的文件系统映像或正在某些 unix 变体上执行的可执行文件。


Ale*_*ios 20

这是一个经典的竞争条件,因此根据定义,结果是不可预测的。

其中,取决于

  • fopen(3)open(2)写模式,
  • 作者如何/如果正在缓冲其输出,
  • 读者如何阅读文件,
  • 读写器之间的速度差异,
  • 读取和写入开始之间的时间差。
  • 当然,在现代多核机器上,由于其他因素(例如进程调度),事情变得更加复杂。

如果您需要能够在重写文件时读取文件,那么您可以让编写器制作文件的临时副本,修改它,然后将其复制回原始文件。例如,这种方式就是这样rsync做的。有很多方法可以实现这一点,但没有免费的午餐。每种方法都有其自身的缺点和影响。