欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

文件共享

程序员文章站 2022-03-06 14:59:57
...
    UNIX系统支持在不同进程间共享打开文件。为说明这种这种共享,需要先介绍内核用于所有I/O 的数据结构。
    内核使用三种数据结构表示打开文件,它们之间的关系决定了在文件共享方面一个进程对另一个可能产生的影响。这三种数据结构说明如下:
    (1) 每个进程在进程表中都有一个记录项,记录项中包含一张文件描述符表,可将其视为一个矢量,每个描述符占用一项,与每个描述符相关联的是:
    a. 文件描述符标志;
    b. 指向一个文件表项的指针。
    (2) 内核为所有打开文件维持一张文件表,每个文件表项包含:
    a. 文件状态标志(读、写、添写、同步和非阻塞等);
    b. 当前文件偏移量;
    c. 指向该文件 v 节点表项的指针。
    (3) 每个打开文件(或设备)都有一个 v 节点(v-node)结构(注:Linux 没有使用 v 节点,而是使用了通用 i 节点结构。虽然两种实现有所不同,但在概念上还是一样的,两者都指向文件系统特有的 i 节点结构)。它包含了文件类型和对此文件进行各种操作函数的指针。对于大多数文件,v 节点还包含了该文件的 i 节点(i-node,索引节点)。这些信息是在打开文件时从磁盘上读入内存的,所以文件的所有相关信息都是随时可用的。例如,i 节点包含了文件的所有者、文件长度、指向文件实际数据块在磁盘上所在位置的指针等。
    在此,我们忽略了那些不影响讨论的实现细节。例如,打开文件描述符表可存放在用户空间(作为一个独立的对应于每个进程的结构,可以换出),而非进程表中。这些表也可用多种方式实现,可以是数组,也可以是结构链表。下图显示了一个进程对应的三张表之间的关系。该进程有两个不同的打开文件:一个文件从标准输入打开(文件描述符0),另一个从标准输出打开(文件描述符为1)。
文件共享
            
    
    博客分类: unix编程 unixlinux数据结构 
    根据这张表,当两个独立的进程打开了同一文件时,就会有类似下图的关系。
文件共享
            
    
    博客分类: unix编程 unixlinux数据结构 
    这里,打开该文件的每个进程都获得各自的一个文件表项(也可能有多个文件描述符项指向同一文件表项,比如使用 dup 函数时,另外在 fork 后也会发生同样的情况,此时父进程、子进程各自的每一个打开文件描述符共享同一个文件表项),以便每个进程都有它自己的对该文件的当前偏移量,但对一个给定的文件只有一个 v 节点表项。
    在给出了这些数据结构后,就可作进一步说明。
    * 在完成每个 write 后,在文件表项中的当前文件偏移量即增加所写入的字节数。如果这导致当前文件偏移量超出了当前文件长度,则将 i 节点表项中的当前文件长度设置为当前文件偏移量(也就是该文件加长了)。
    * 如果用 O_APPEND 标志打开一个文件,则相应标志也被设置到文件表项的当前状态标志中。每次对这种具有追加写标志的文件执行写操作时,文件表项中的当前文件偏移量首先会被设置为 i 节点表项中的文件长度。这就使得每次写入的数据都追加到文件的当前尾端处。
    * 若一个文件用 lseek 定位到文件当前的尾端,则文件表项中的当前偏移量被设置为 i 节点表项中的当前文件长度。
    * lseek 函数只修改文件表项中的当前文件偏移量,不进行任何 I/O 操作。
    最后要注意的是,文件描述符标志和文件状态标志在作用范围方面的区别,前者只用于一个进程的一个描述符,而后者则应用于指向该给定文件表项的任何进程中的所有描述符。
  • 文件共享
            
    
    博客分类: unix编程 unixlinux数据结构 
  • 大小: 25.6 KB
  • 文件共享
            
    
    博客分类: unix编程 unixlinux数据结构 
  • 大小: 34.8 KB