`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, seekclose构成操作系统的接口。在该接口中,它维护一些数据结构。这些数据结构对标准库的用户不感兴趣。

提到的功能不在文件系统上运行。因此,这些功能不会修改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表条目?的主要内容,如果未能解决你的问题,请参考以下文章

访问 .ldb 文件和多重连接。

linux下socket编程中close()函数??

require.js + cldrjs 为啥重命名配置路径条目会破坏它?

linux 文件描述符 引用计数(close(fd)只是使fd的引用计数-1)

添加新字段(和/或方法)是不是会破坏 OCP(开放封闭原则)?

Linux系统编程---dup和dup2详解