文件相关的几个重要概念

2017-11-05  本文已影响36人  守拙圆

作者:penghuster


文件描述符

当打开一个现有文件或新建一个文件时,内核向调用进程返回一个非负的文件标识符。对于内核而言,所有打开的文件都是通过文件描述符引用(注意,Linux 内一起皆文件)。

流的定向

对于 ASCII 字符集,一个字符用一个字节表示,对于国际字符集,一个字符可用多个字节表示。流的定向决定了所读、写的字符是多字节还是单字节。

文件共享

文件共享涉及的数据结构

系统使用文件时,涉及到 4 个内核数据结构,他们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。

  1. 进程表项(PCB)(进程创建时
    每个进程在进程表中都有一个记录项,记录项中包含一张打开文件描述符表,每个描述符占用一项。与每个文件描述符关联的是:
    a. 文件描述符标志(close_on_exec)。
    b. 指向一个文件表项的指针。
  2. 文件表项(打开文件时
    每打开一个文件内核都创建并维护一张文件表,文件表项包含:
    a. 文件状态标志(读、写、读写、同步和非阻塞等)。
    b. 当前文件偏移量。
    c. 指向该文件 v 节点表项的指针。
  3. v节点结构(v-node)(第一次打开文件时
    内核中为每一个打开的文件都维护一个 v 节点结构。v节点包含:
    a. 文件类型。
    b. 文件各种操作函数的指针。
    c. i 节点。
  4. i 节点(文件创建时
    i 节点时文件打开时,从磁盘读入内存的。i节点内容包含:
    a. 文件所有者、文件长度等
    b. 指向文件实际数据块在磁盘上所在位置的指针等

文件几种不同使用情况

  1. 同一个进程中打开两个不同文件
  1. 两个独立进程各自打开同一文件
  1. dup 复制文件描述符

文件系统

我们可以把一个磁盘分成一个或多个分区。每个分区可以包含一个文件系统,i 节点是固定长度的记录项,它包含有关文件的大部分信息。

磁盘、分区、文件系统 硬链接

几个概念比较

操作对象

缓冲

文件 IO: 虽然称之为不带缓冲的 IO ,但实际上是存在缓冲的,因为大部分系统在读写磁盘(或其它 IO 设备)时,为了提高效率,会在内核进行缓冲。而此处的不带缓冲主要是从用户态来看,相对与标准 IO 来说,文件 IO 在用户态没有缓存。
标准 IO: 标准 IO 是基于文件 IO 实现的,标准 IO 的缓冲分为三种:

行缓冲的两个限制:

  1. 因为标准 IO 用于行缓冲的缓冲区长度固定,所以只要填满缓冲区,即使没有换行符,也将进行文件 IO 操作。
  2. 为了保证输入与输出切换时候,文件读写正常,切换到输出时,必须首先冲洗标准 IO 的缓冲区。

几种不同 IO


版权声明:自由转载-非商用-非衍生-保持署名创意共享3.0许可证

上一篇下一篇

猜你喜欢

热点阅读