摆好姿势后这个问题,我对 linxu 内核的操作感到有点困惑。
首先,我知道进程如何将字符串写入文件:进程会获取一些缓冲区,该缓冲区可以由进程写入,一旦缓冲区满或进程刷新缓冲区,缓冲区的内容将被写入写进数据块文件的。例如,在C程序中,当我们printf
a时\n
,它将刷新缓冲区。
现在,让我们考虑上面帖子中的情况:一个进程打开了一个文件并正在写入该文件,而该文件被命令删除rm
。
据我了解,该命令rm
将取消链接文件,这意味着它的索引节点和数据块将被标记为UNUSED
.所以我们不能再通过文件名来访问它了。如果进程打开一个文件,内核将创建一个文件描述符来访问它。
因此,如果我是对的,rm
进程正在写入的文件不会导致进程出现任何错误,因为进程可以通过文件描述符访问该文件。正如有人在那篇文章的评论中提到的,我们仍然可以通过cat /proc/<pid>/fd/3
.
现在我很困惑。如果我们仍然可以通过cat /proc/<pid>/fd/3
inode 和数据被标记为UNUSED
因为 来访问该文件rm
,这是否意味着内核会将整个文件保存在 RAM 中?如果是这样,如果文件非常大,例如某些日志文件,是否意味着将使用大量 RAM?
简而言之,如果文件没有被rm
编辑,进程可以将内容写入缓冲区,一旦缓冲区被刷新,其内容将被写入文件的数据块中。但是如果一个文件已经被rm
编辑,它的数据块将被标记为,UNUSED
但进程仍然可以写入它。这是哪里”它“?
答案1
据我了解,该命令
rm
将取消链接文件,这意味着它的索引节点和数据块将被标记为UNUSED
.
这是理解这里发生的事情的关键:rm
只要求内核删除给定的目录条目。如果目录项指向的 inode 不再被其他任何内容(其他目录项、打开的文件描述、文件映射、循环挂载等)引用,则内核还将释放该 inode 和相关数据。
因此,内核不需要保留已删除文件的数据:无论文件系统将其保存在何处,它仍然存在。只要进程拥有指向它的文件描述符,它就会保留在那里,并且可以/proc/.../fd/...
在 Linux 上恢复。