Unix行为,两个不同的进程将描述符保存到同一个文件,一个进程删除该文件

时间:2011-02-14 14:12:38

标签: file unix system kernel

我是一个Unix新手。我有两个进程将句柄(文件描述符)保存到同一个文件 在磁盘上。

让进程为A,B和文件sample.txt说

进程A是生产者(将数据写入磁盘文件),进程B是消费者(读取 来自磁盘文件)。

进程A已达到将文件句柄(描述符)关闭到磁盘文件的程度 sample.txt,从磁盘中删除文件并打开一个具有相同名称的新文件 “sample.txt”并开始写入新文件。与此同时,流程B仍然有旧的 描述符指向由进程A删除的旧文件。

现在,当进程B尝试使用它的旧描述符读取文件时会发生什么 它仍然可以完全读取旧的“sample.txt”文件直到最后?

Unix大师,请对此有所了解。任何指向Unix内核文档的指针都是 非常感谢。

1 个答案:

答案 0 :(得分:2)

内核维护每个打开文件的引用计数。第二个进程(B)将从原始文件中读取,在第二个进程关闭文件描述符之前,该文件不会从磁盘中删除,但是没有其他进程能够打开该旧版本的文件。

编辑0:

稍微详细一点 - 文件系统中的每个文件都由inode表示,然后多个directories可以指向它(这些是hard links)。因此,这里有两个引用计数 - 磁盘上链接计数,以及给定文件上open(2)调用的内核内计数(无论通过哪个链接)。仅当两个计数都归零时,才会删除文件,即其inode被回收。

要将其转换为您的示例 - 当进程A删除原始文件时,将删除目录条目,inode链接计数变为零,但不会open() - 计数。在处理inode调用B之前,close(2)仍然没有免费。