文件
内核用三种相关的数据结构来表示打开的文件:
1)描述符表 : 每个进程都有它独立的描述符表,它的表项是由进程打开的文件描述符来索引的.每个打开的描述符表项指向文件表中的一个表项.
2) 文件表 : 打开文件的集合是由一张文件表来表示的,所有的进程共享这张表.每个文件表的表项组成包括有当前的文件位置,引用计数(当前)指向该表项的描述符项数,以及一个指向v-node表中对应表项的指针。关闭一个描述符会减少相应的文件表项中的引用计数。内核不会删除这个文件表表项,直到它的引用计数为零。
3)v-node表 : 同文件表一样,所有的进程共享这张v-node表。每个表项包含stat结构中的大多数信息,包括st_mode和st_size成员.
下图是一个实例,其中描述符1和4通过不同的打开文件表表项来引用两个不同的文件,这是一种典型的情况,没有文件共享,并且每个描述符对应一个不同的文件:
多个描述符也可以通过不同的文件表表项来引用同一个文件。例如,如果以同一个文件名调用open函数2次,就会发生这种情况。关键思想是每个文件描述符都有它自己的文件位置,所以不同描述符的读操作可以从文件的不同位置获取数据: