打开文件在 linux 系统上的行为如何?

rip*_*234 18 open-files rename files

我刚刚将一个日志文件重命名为“foo.log.old”,并假设应用程序将开始在“foo.log”处写入一个新的日志文件。我惊讶地发现它跟踪日志文件到它的新名称,并不断向“foo.log.old”附加行。

在 Windows 中,我不熟悉这种行为——我不知道是否有可能实现它。这种行为在 linux 中究竟是如何实现的?我在哪里可以了解更多信息?

dmc*_*ten 23

程序通过文件系统维护的编号(在传统的 unix 文件系统上称为 inode)连接到文件,该名称只是一个引用(可能不是唯一的引用)。

所以有几点需要注意:

  1. 移动文件 usingmv不会更改该底层编号,除非您跨文件系统移动它(这相当于在原始文件上使用cpthen rm)。
  2. 因为多个名称可以连接到单个文件(即我们有硬链接),“已删除”文件中的数据不会消失,直到对下级文件的所有引用消失。
  3. 也许最重要的是:当程序opensa 文件时,它会引用它(出于何时删除数据的目的),相当于将文件名连接到它。

这会导致多种行为,例如:

  • 程序可以open读取文件,但直到用户rm在命令行中编辑它之后才真正读取它,并且程序仍然可以访问数据
  • 您遇到的问题:mv处理文件不会断开文件与打开它的任何程序之间的关系(除非您跨越文件系统边界移动,在这种情况下,程序仍然有原始版本可以处理)。
  • 如果程序已经open编辑了一个用于写入的文件,并且用户rm在命令行中使用它的最后一个文件名,则程序可以继续将内容放入文件中,但是一旦关闭,将不再引用该数据并且它会消失。
  • 通过一个或多个文件进行通信的两个程序可以通过在完成后删除文件来获得粗略的部分安全性open。(这不是真正的安全意识,它只是将一个巨大的漏洞转化为竞争条件。)