UNIX:描述符和文件结构

对于一个打开的文件,UNIX提供了三种数据结构来表示。

1)进程地址空间中的进程表项中的描述符表。其实就是一个数组,每一项就是一个k-v,k是fd,v是该描述符对应的打开文件在内核中的文件表项的地址。

2)文件表项。包括文件状态标志当前文件偏移量、v节点的地址。文件状态标志位提供一些文件操作的选项、文件偏移量提供当前文件在内核中的读写初识位置、v节点地址是指向v节点的指针。

3)v节点和i节点。v节点包含了文件的类型和对于此文件进行操作的各种函数指针集合、i节点指针指向i节点。i节点包括文件的所有者、文件长度、指向文件实际数据块在磁盘上的位置

UNIX:描述符和文件结构

一般来说,一个进程中的文件描述符对应于一个内核中的文件表项。这是因为每个进程都有各自的对该文件的一个当前偏移量。一个给定的文件,在unix系统中对应于一个v节点表项。

多个文件表项可以对应于同一个v节点表项。但是当多个进程同时对这一个临界区(文件)进行写操作的时候会发生不同步带来的混乱。因此应当保证一个进程对于当前文件的操作是原子的。例如O_APPEND标志就是表示当前进程对于该文件的追加是原子的。

多个文件表项在dup或者fork调用情况下,会使得多个进程表项共同指向同一份文件表项。dup用来复制现有的文件描述符。