日期:2014-05-16  浏览次数:20762 次

Linux文件共享(二)——两个独立进程打开同一个文件

如果两个独立进程各自打开了同一文件,则有图3-2中所示的安排。我们假定第一个进程使该文件在文件描述符3上打开,而另一个进程则使此文件在文件描述符4上打开。打开此文件的每一个进程都得到一个文件对象但对一个给定的文件只有一个v节点表项。每个进程都有自己的文件对象的一个理由:这种安排使每个进程都有它自己对该文件的当前位移量这种情况不会增加对应的打开文件引用计数,而会增加dentry的引用。

 

       给出了这些数据结构后,现在对前面所述的操作作进一步说明。

(1) 在完成每一个write后,在文件表项中的当前文件位移量即增加所写的字节数。如果这使当前文件位移量超过了当前文件长度,则在i节点表象中的当前文件长度被设置为当前文件位移量(也就是该文件加长了)

(2)   如果用O_APPEND标志打开一个文件,则相应标志也被设置到文件表项file对象)的文件状态标志中。每次对这种具有填写标志的文件执行写操作时,在文件表项中的当前文件位移量首先被设置为i节点表项中的文件长度。这就使得每次写的数据都添加到文件的当前尾端处。

(3)  lseek值修改文件表项中的当前文件位移量,没有进行任何I/O操作。不影响i节点,只影响file对象,详细分析请见lvyilong316博客:空洞文件)

(4)  若一个文件用lseek被定位到文件当前的尾端,则文件表项中的当前文件位移量被设置为i节点表项中的当前文件长度。

将图3-2转化为linux下的具体实现,如下图所示。


<