我是 Unix 新手。我有两个进程持有同一个文件的句柄(文件描述符) 在磁盘上。
设进程为A、B,文件sample.txt说
进程A是生产者(将数据写入磁盘文件),进程B是消费者(读取 来自磁盘文件)。
进程 A 已达到关闭磁盘文件的文件句柄(描述符)的程度 sample.txt,从磁盘中删除文件并打开一个同名的新文件 “sample.txt”并开始写入新文件。同时进程 B 仍然有旧的 指向被进程A删除的旧文件的描述符。
现在,当进程 B 尝试使用它的旧描述符读取文件时会发生什么 它仍然能够完整地读取旧的“sample.txt”文件直到最后?
Unix 专家,请对此有所了解。任何指向 Unix 内核文档的指针都是 非常感谢。
最佳答案
内核为每个打开的文件维护一个引用计数。第二个进程 (B) 将从原始文件读取,该文件不会从磁盘中删除,直到第二个进程关闭文件描述符,尽管没有其他进程能够打开该文件的旧版本。
编辑0:
更详细一点 - 文件系统中的每个文件都由 inode
表示, 然后是多个 directories可以指向它(这些是 hard links )。所以这里有 两个 引用计数 - 磁盘链接计数,以及对给定文件的 open(2)
调用的内核计数(无论通过哪个链接)。只有当两个计数都为零时,文件才会被删除,即它的 inode
被回收。
将其转化为您的示例 - 当进程 A
删除原始文件时,目录条目将被删除,inode
链接计数变为零,但 open()
-计数。在进程 B
调用 close(2)
之前,inode
仍未空闲。
关于file - Unix 行为,两个不同的进程将描述符保存到同一文件,一个进程删除文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4993136/