2026-06-16 18:04:59
描述符表:
每个进程都有自己的描述符表。
描述符在进程启动时默认打开3个:标准输入(STDIN_FILENO,值为0)、标准输出(STDOUT_FILENO,值为1)、标准错误(STDERR_FILENO,值为2)。
当调用close()函数时,系统会回收对应的描述符。
文件表:
文件表中的一个表项可能被多个描述符指向,引用计数用来表示当前有多少个描述符指向该文件表表项。
当调用close()函数时,系统会将描述符对应的文件表表项的引用计数减1,如果引用计数已经为0,则系统会删除此文件表表项。
文件位置表示下一次读或写的起始位置,seek、read、write函数都可以修改该文件位置。
v-node 表:
v-node表中的一个表项可能被多个文件表表项指向。
当对同一个文件调用多次open()函数时,会产生多个文件表表项,但只有一个v-node表表项。
三者之间的关系:
示例说明:
进程启动时的描述符表与文件表关系:
当shell启动一个进程时,会默认打开3个描述符(标准输入、标准输出、标准错误),每个描述符都指向了一个文件表表项。
fork()调用后的描述符表与文件表关系:
当程序调用fork()函数时,父进程和子进程会共享相同的文件表,但会有各自独立的描述符表。此时,多个描述符(分别属于父进程和子进程)可能指向同一个文件表表项。
dup2()调用后的描述符表与文件表关系:
dup2()函数用oldfd的内容替换掉newfd的内容。如果newfd是打开的,则会先关闭newfd再替换。这样,同一个进程中的多个描述符也可能指向同一个文件表表项。
多次open()调用后的文件表与v-node表关系:
当对同一个文件调用多次open()函数时,会产生多个文件表表项(因为每次打开都会创建一个新的文件表表项),但只有一个v-node表表项(因为文件本身没有变化,只是被多次打开)。
图片展示:
(由于markdown格式限制,无法直接展示图片,但以下链接对应的图片描述了上述关系)




综上所述,描述符表、文件表与v-node表是操作系统管理文件打开状态、文件状态信息及文件元数据信息的重要数据结构。它们之间的关系体现了操作系统对文件管理的精细控制和高效利用。