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

标签 file unix system kernel

我是 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/

相关文章:

python - python tkinter 中的菜单 : save file to a new directory

c - 如何使用 Motif 编译 '97 C 代码?

linux - Unix zip 命令正在更新现有存档而不是创建新存档

c - close() 在 Linux 上调用 fsync() 吗?

system - Google 的 Golang 是解释器还是编译器?

c - 如何在 C 中捕获进程输出?

python - 根据输入列表重命名文件 Python

c - 用 C 读取文件并将内容传递给 main()

java - 连续文件更新,递归函数?

C - UNIX - 检查 getpriority() 是否返回错误