繁体   English   中英

Linux 如何管理删除临时文件?

[英]How does Linux manage deleting temporary files?

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

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

如果有人能一步一步给出解释,那就派上用场了!

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

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

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

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

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

此时,进程可以继续使用临时文件,但由于没有名称,其他进程无法打开它。

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

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

我一直在对该主题进行一些研究,并且发现了一些额外的信息来补充 Barmar 提供的答案。

我阅读了 tmpfile() 系统调用。 这个系统调用创建一个临时文件并返回一个流描述符。

问题是 tmpfile 在内部调用取消链接。 从而减少链接计数。 尽管此链接是最后一个链接,但如果该文件已被任何进程打开,则它会一直存在,直到关闭为止。 我不是 100% 确定这个过程在内部是如何工作的,但我认为这是由于 iPut 算法验证引用计数和链接计数的顺序。 我已经看到了 iPut 的一些实现,首先,它检查引用计数是否为零,如果是,则转到链接计数,如果它等于零,则取消分配分配给文件的所有块。

所以在这种情况下,我们将引用计数==1,因为我们仍然有一个打开文件的进程,但链接计数将为零。 因此 iput 在进程关闭文件之前不会释放 i-node。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM