`close(fd)`是否会破坏文件表条目和/或vnode表条目?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了`close(fd)`是否会破坏文件表条目和/或vnode表条目?相关的知识,希望对你有一定的参考价值。
在Unix中
#include <unistd.h>
int close(int fd);
close(fd)
还必须销毁与fd
相关的文件表条目是否正确?是的,即使有另一个文件描述符引用相同的文件表条目?close(fd)
是否也会破坏与vnode表条目关联的vnode表条目,或者不一定?是的,即使有另一个文件表条目引用相同的vnode表条目?
谢谢。
对于“进程文件描述符表”,“(内核)文件表”,“vnode”,请参阅http://www.cs.rpi.edu/academics/courses/fall04/os/c18/
注意:我的问题来自APUE。我实际上对Linux很感兴趣,但Linux没有vnode,而是一般的inode结构。所以对于“vnode”仍然适用,我不得不要求Unix。
close
关闭文件描述符。如果该描述符是引用相应的打开文件描述的最后一个描述符,则后者将被关闭,这可能需要进一步的副作用。就单Unix规范/ POSIX而言,这就是Unix的现代意义。
我不确定vnode是什么意思;我假设它是一个历史unix的一部分,并且与打开文件描述有一些对应关系。
您可以假设标准库中的以下函数:open, read, write, seek
和close
构成操作系统的接口。在该接口中,它维护一些数据结构。这些数据结构对标准库的用户不感兴趣。
提到的功能不在文件系统上运行。因此,这些功能不会修改vnode或inode。如果操作需要这样的修改,它们将由操作系统的文件系统部分操作/修改。例如,写入可能需要分配磁盘上的新块,这些块必须在inode中注册。
标准库的unlink
函数指示操作系统删除文件。如果操作系统可以删除文件(即它没有受到保护,未被其他进程打开等),它将从文件系统中删除文件,从而修改inode。 (具有延迟删除的文件系统将文件移动到回收站)。
所以:close(fd)
也破坏了与fd
相关的文件表条目是不正确的,如果使用“文件表条目”你的意思是文件系统中的条目,除了可能是短暂的临时文件(但是,那些可能永远不会有无论如何,取决于操作系统的文件系统软件,
并且:不,close(fd)
不会破坏“与vnode表条目相关联的vnode表条目”(无论如何都是奇怪的句子),如果使用vnode则表示某种类型的inode。
EDIT:
参考您的课程材料:
close(fd)是否还必须销毁与fd关联的文件表条目是否正确?是的,即使有另一个文件描述符引用相同的文件表条目?
不,这不正确。 close
将破坏流程的流程文件描述符表中的条目。内核文件表必须保持引用计数(未在课程资料中显示),当它变为零时,可以删除KFT的条目。因此,close
仅导致KFT中的引用计数递减。
close(fd)
是否也会破坏与vnode表条目关联的vnode表条目,或者不一定?是的,即使有另一个文件表条目引用相同的vnode表条目?
我发现这个问题不相关或者我不理解。没有vnode表条目。 KFT中只有一个vnode标识符。管理vnode(即存储分配和释放)超出了您的课程范围。
以上是关于`close(fd)`是否会破坏文件表条目和/或vnode表条目?的主要内容,如果未能解决你的问题,请参考以下文章
require.js + cldrjs 为啥重命名配置路径条目会破坏它?
linux 文件描述符 引用计数(close(fd)只是使fd的引用计数-1)