//
1、UNIX文件描述符
Unix操作系统或者Linux操作系统的文件描述符使用一个非负整数来表示,但是文件描述符不仅仅是一个非负数,Unix对于文件IO有以下几个数据结构:
A. 每个进程都有一个进程表,其中有个记录表项,这个记录表项指向的是一个打开文件描述符表,这个文件描述符表是一个矢量表,每个文件描述符占用的是一个表项,但是这个表项里面包含两部分内容,第一个是文件描述符标志,也就是通常所属的fd,另一个内容是一个指向文件表项的指针;这里指向的是一个文件表项,不是一个文件表。
B. Unix/Linux内核为所有打开的文件建立了一个文件表,由文件表项来构成。其中每个文件表项包含一下几个方面的内容:第一个是文件状态标志,这个标志指明了文件的当前状态,比如说,可读,可写,阻塞等;第二个是当前文件偏移量;第三个是指向文件v节点的指针;从这里也可以看出来为什么在另外的一个终端中打开已经打开的一个文件的时候,显示的并不是文件的开头部分,而是文件的当前偏移位置,但是当另外一个用户登录的时候,显示的是文件的开头部分。
C. 每个打开的文件都有一个V节点结构,Linux没有这个结构。这个v节点包含两个部分:第一个部分是文件操作的函数,第二个部分是文件的i节点;其中i节点包含的是文件的所有者,文件长度,指向文件实际数据块在磁盘上的位置的指针等信息。I节点的这些信息是在从磁盘读入内存的时候从磁盘获取的。
使用v节点的目的是为了能够支持多文件系统类型。
//
参考:《Unix 环境高级编程》