文件描述符表
在每个进程表中都有一个记录项,记录项中包含有一张打开文件描述符表,可将其视察为一个矢量(数组),每个描述符占用一项。与每个文件描述符相关联的是
a)文件描述符标志
b)指向一个文件表项的指针
单个进程独享
注:其中close-on-exec标志,如果某个文件符设置了该标志,fcntl(fd,F_SETFD,1),则在该进程调用exec函数之前为exec族函数释放对应的文件描述符
文件表
内核为所有打开的文件维持一张文件表(同一个文件可以被打开多次,所以同一个文件可以在文件表中占有多项)。每个文件表项包含:
a)文件状态标志(读、写、添写、同步和非阻塞等)
b)当前文件偏移量(不同的进程当前的文件偏移量是不同的,你想两个不同的进程对同一个文件的操作可能都不一样,那当然文件偏移量是不一样的)
c)指向该文件的V节点表项的指针。
所有进程共享文件表
v节点表
每个打开文件都有个v节点结构,v节点包含了文件类型和对此文件进行各种操作的函数指针。对于大多数文件,v节点还包含了该文件的i节点. 这些 信息是在打开文件时从磁盘上读入内存的,
所以所有关于文件的信息都是随时文件描述符表快速可供使用的。
(linux下没有使用v节点,而是使用了通用i节点结构。虽然两种实现有所不同,但是在概念上,v节点与i节点是一样的。两者都指向文件系统特有的i节点结构)
所有进程共享v节点表
Linux没有将相关数据结构分为i节点和v节点,而是采用了一个与文件系统相关的i节点和一个与文件系统无关的i节点. 如果两个独立进程各自打开了同一个文件,则就会出现下图的这种情况:
父进程调用fork之后,子进程会拷贝父进程的文件描述符表,因此子进程会共享父进程的文件表。文件描述符表是独立于进程中的,而文件表项和i-node表是内核共享的。
内核删除文件表之前,父子进程必须都关闭了他们的描述符(因为引用计数会变成2)。
父进程打开文件A和B,并且文件描述符是10和11,同样,子进程也是用文件描述符10和11来指向文件A和B。
小结:文件表中的引用计数发生改变的场景只存在于父进程fork子进程的时候,如果在单个进程中重复打开文件A,那么会在文件表里存在多项。
标签:文件,表项,描述符,Linux,进程,打开,节点 From: https://www.cnblogs.com/zhanggaofeng/p/17154259.html