我是一个Unix新手。我有两个进程将句柄(文件描述符)保存到同一个文件 在磁盘上。
让进程为A,B和文件sample.txt说
进程A是生产者(将数据写入磁盘文件),进程B是消费者(读取 来自磁盘文件)。
进程A已达到将文件句柄(描述符)关闭到磁盘文件的程度 sample.txt,从磁盘中删除文件并打开一个具有相同名称的新文件 “sample.txt”并开始写入新文件。与此同时,流程B仍然有旧的 描述符指向由进程A删除的旧文件。
现在,当进程B尝试使用它的旧描述符读取文件时会发生什么 它仍然可以完全读取旧的“sample.txt”文件直到最后?
Unix大师,请对此有所了解。任何指向Unix内核文档的指针都是 非常感谢。
答案 0 :(得分:2)
内核维护每个打开文件的引用计数。第二个进程(B)将从原始文件中读取,在第二个进程关闭文件描述符之前,该文件不会从磁盘中删除,但是没有其他进程能够打开该旧版本的文件。
稍微详细一点 - 文件系统中的每个文件都由inode
表示,然后多个directories可以指向它(这些是hard links)。因此,这里有两个引用计数 - 磁盘上链接计数,以及给定文件上open(2)
调用的内核内计数(无论通过哪个链接)。仅当两个计数都归零时,才会删除文件,即其inode
被回收。
要将其转换为您的示例 - 当进程A
删除原始文件时,将删除目录条目,inode
链接计数变为零,但不会open()
- 计数。在处理inode
调用B
之前,close(2)
仍然没有免费。