文件相关的几个重要概念
2017-11-05 本文已影响36人
守拙圆
作者:penghuster
文件描述符
当打开一个现有文件或新建一个文件时,内核向调用进程返回一个非负的文件标识符。对于内核而言,所有打开的文件都是通过文件描述符引用(注意,Linux 内一起皆文件)。
流的定向
对于 ASCII 字符集,一个字符用一个字节表示,对于国际字符集,一个字符可用多个字节表示。流的定向决定了所读、写的字符是多字节还是单字节。
文件共享
文件共享涉及的数据结构
系统使用文件时,涉及到 4 个内核数据结构,他们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。
- 进程表项(PCB)(进程创建时)
每个进程在进程表中都有一个记录项,记录项中包含一张打开文件描述符表,每个描述符占用一项。与每个文件描述符关联的是:
a. 文件描述符标志(close_on_exec)。
b. 指向一个文件表项的指针。 - 文件表项(打开文件时)
每打开一个文件内核都创建并维护一张文件表,文件表项包含:
a. 文件状态标志(读、写、读写、同步和非阻塞等)。
b. 当前文件偏移量。
c. 指向该文件 v 节点表项的指针。 - v节点结构(v-node)(第一次打开文件时)
内核中为每一个打开的文件都维护一个 v 节点结构。v节点包含:
a. 文件类型。
b. 文件各种操作函数的指针。
c. i 节点。 - i 节点(文件创建时)
i 节点时文件打开时,从磁盘读入内存的。i节点内容包含:
a. 文件所有者、文件长度等
b. 指向文件实际数据块在磁盘上所在位置的指针等
文件几种不同使用情况
- 同一个进程中打开两个不同文件
- 两个独立进程各自打开同一文件
- dup 复制文件描述符
文件系统
我们可以把一个磁盘分成一个或多个分区。每个分区可以包含一个文件系统,i 节点是固定长度的记录项,它包含有关文件的大部分信息。
磁盘、分区、文件系统- 硬链接
在下图中两个目录项指向同一个i节点。每个i节点中都有一个链接计数,其值是指向该i节点的目录项数,只有当链接计数减少为0时,才可删除文件(也就是释放文件所占用的数据块),此种链接称为硬链接
-
软链接
软链接也称为符号链接,符号链接的实际内容(在数据块中)包含了该符号链接所指向的文件的名字。
软链接
几个概念比较
操作对象
- 文件 IO:是基于文件的操作。
- 标准 IO:是基于流的操作。
缓冲
文件 IO: 虽然称之为不带缓冲的 IO ,但实际上是存在缓冲的,因为大部分系统在读写磁盘(或其它 IO 设备)时,为了提高效率,会在内核进行缓冲。而此处的不带缓冲主要是从用户态来看,相对与标准 IO 来说,文件 IO 在用户态没有缓存。
标准 IO: 标准 IO 是基于文件 IO 实现的,标准 IO 的缓冲分为三种:
- 全缓冲:在全部填满标准 IO 的缓冲区后,才进行一次文件 IO 的调用。
- 行缓冲:但输入输出遇到换行符时,进行一次文件 IO 的调用。
行缓冲的两个限制:
- 因为标准 IO 用于行缓冲的缓冲区长度固定,所以只要填满缓冲区,即使没有换行符,也将进行文件 IO 操作。
- 为了保证输入与输出切换时候,文件读写正常,切换到输出时,必须首先冲洗标准 IO 的缓冲区。
- 不带缓冲:标准 IO 不对字符进行缓冲。
几种不同 IO
- 文件 IO:最基本的 IO,所有其它 IO 都是依赖于此 IO。
- 标准 IO:主要读写字符(文本文件)
- 二进制IO:主要读写数据结构,以二进制方式读取,指定读写长度
- 格式化 IO:主要用于格式化输入输出
- 内存 IO:将内存模拟为文本文件以字符的方式读写。
版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)