《Unix环境高级编程》——文件I/O(2)

文件共享

UNIX系统支持在不同进程间共享打开文件。

内核使用3种数据结构标识打开文件,它们之间的关系决定了在文件共享方面一个进程可能对另一个进程产生的影响。

1)每个进程在进程表种都有一个记录项,记录项中包含一张打开文件描述符表,每个描述符占用一项。与每个文件描述符项关联的是:a. 文件描述符标志; b. 指向一个文件表项的指针。

2)内核为所有打开文件维持一张文件表,每个文件表项包括:

a. 文件状态标志(读、写、添写、同步)

b. 当前文件偏移量

c. 指向该文件v节点表项得指针

3)每个打开文件都有一个v节点(v-node)结构。v节点包含了文件类型和对文件进行各种操作函数的指针。对于多数文件,v节点还包含了该文件的i节点。

 创建v节点的结构的目的是对一个计算机系统上的多个文件系统类型提供支持。

Linux没有将相关数据结构分为v节点和i节点,而是采用了一个与文件系统相关的i节点和一个与文件系统无关的i节点。

如果两个独立进程各自打开了同一文件,关系如下:

第一个进程在文件描述符3上打开该文件,另一个进程在文件描述符4上打开该文件。

之所以每个进程都获得自己的文件表项,因为每个进程都有它自己的对该文件的当前偏移量。

  • 每个write后,在文件表项中的当前文件偏移量即增加所写入的字节数。如果这导致当前文件偏移量超出当前文件长度,则将i节点表项中的当前文件长度设置为当前文件偏移量。
  • 如果用O_APPEND打开一个文件,则相应标志也被设置到文件表项的文件状态标志中。对具有追加写标志的文件执行写操作时,文件表项中的当前文件偏移量首先会被设置为i节点表项中的文件长度。
  • 用lseek定位到文件当前的尾端,则文件表项中的当前文件偏移量被设置为i节点表项中的当前文件长度。
  • lseek函数只修改文件表项中的当前文件偏移量,不进行任何I/O操作。

原子操作

原子操作指的是由多步组成的一个操作,如果该操作原子地执行,则要么执行完所有步骤,要么一步也不执行,不可能只执行所有步骤的一个子集。

 

 

发布了23 篇原创文章 · 获赞 0 · 访问量 976

猜你喜欢

转载自blog.csdn.net/u014635079/article/details/104383826