Linux 如何删除临时文件?

Adr*_*ui3 1 linux temporary-files linux-kernel

我一直在研究一些 Linux 实现,并且想到了一个问题。

据我所知,有一个位将文件标记为临时文件。当生成该文件的进程死亡时,内核如何删除它?我认为它可能与文件描述符表有关,但我不确定。

如果有人能一步一步地给出解释,那将会派上用场!

Bar*_*mar 6

没有任何位将文件标记为临时文件。

每个索引节点都有一个链接计数字段,它是引用该文件的目录条目的数量。每次您对文件建立硬链接时,该计数就会增加,而当您删除名称时,该计数就会减少;当计数变为零时,文件被删除(索引节点被标记为可用,并且所有数据块都被放入空闲列表中)。

当在进程中打开文件时,inode 的副本会保留在内核的文件表中,并且引用它的文件句柄的数量将添加到该副本的链接计数中。当进程关闭其文件描述符时,链接计数就会减少。在内存中的链接计数降至零之前,该文件实际上不会被删除。这就是文件在打开时保留在磁盘上的原因,即使所有名称都被删除。

因此,当您创建临时文件时,它会执行以下步骤:

  1. 创建文件。磁盘上的 inode 链接计数 = 1。
  2. 打开文件。内核 inode 链接计数 = 2。
  3. 删除文件名。内核 inode 链接计数 = 1。

此时,该进程可以继续使用临时文件,但它不能被其他进程打开,因为它没有名称。

当进程关闭文件句柄时,链接计数变为 0,并且文件被删除。

最近版本的 Linux 有一个O_TMPFILE标志可以open(2)自动执行此操作。您无需指定文件名,只需指定目录,该目录仅用于查找保存文件数据的文件系统。使用此功能时,它可以在一次调用中有效地执行上述所有 3 个步骤,但它实际上不会在任何地方创建文件名(因此可以避免竞争条件和名称冲突)。