我是Unix新手。我有两个进程在磁盘上保存同一个文件的句柄(文件描述符)。
让进程是A,B,文件sample.txt说
进程A是生产者(将数据写入磁盘文件),进程B是使用者(从磁盘文件读取数据)。
进程A已经到了关闭磁盘文件sample.txt的文件句柄(描述符)、从磁盘中删除文件并打开同名为"sample.txt“的新文件并开始写入新文件的地步。同时,进程B还有指向进程A删除的旧文件的旧描述符。
现在,当进程B试图使用它的旧描述符读取文件时会发生什么,并且它是否仍然能够完整地读取旧的"sample.txt“文件直到结束?
Unix古鲁,请给我一点启示。任何指向Unix内核文档的指针都是非常感谢的。
发布于 2011-02-14 14:18:10
内核为每个打开的文件维护一个引用计数。第二个进程(B)将从原始文件中读取,该文件在第二个进程关闭文件描述符之前不会从磁盘中删除,尽管没有其他进程能够打开该文件的旧版本。
编辑0:
更详细一些--文件系统中的每个文件都由一个inode表示,然后多个目录可以指向它(这些是硬链接)。因此,这里有两个引用计数-磁盘上链路计数,和内核内计数的open(2)调用对给定的文件(无论通过哪个链接)。只有当两个计数都为零时,文件才会被删除,即它的inode回收。
要将其转换为您的示例--当process A删除原始文件时,目录条目被删除,inode链接计数为零,而不是open()-count。在进程inode调用close(2)之前,close(2)仍然不是免费的。
https://stackoverflow.com/questions/4993136
复制相似问题