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

Linux文件共享(一)——进程与打开文件

Linux支持在不同进程间共享打开文件。为了说明文件共享,先来说明内核用于所有I/O的数据结构。 他们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。

0.1和文件有关的对象

(1) inodei节点): 保存一个文件的通用信息,每个inode有一个inode number,在文件系统中,一个inode number能够唯一地标识一个文件。

(2) dentry(目录项对象):每个dentry代表路径中的一个特定部分。保存一个目录的链接信息。个人理解:描述一个文件和一个名字的对应关系。

(3) file(文件对象):保存一个打开的文件与一个进程的关系,文件对象表示进程已经打开的文件 在内存中的表示,该对象不是物理上的文件。它是由相应的open()系统调用创建,由close()系统调用销毁(只有其引用计数为0时才销毁)。多个进程可以打开和操作同一个文件,所以同一个文件也可能存在多个对应的文件对象。 它即为apue中所说的“目录表项”,内涵文件偏移等信息。

0.2和进程有关的对象

(1)  files_struct每个进程用一个files_struct结构来记录文件描述符的使用情况,这个结构称为用户打开文件表(含有描述符表)。它是进程的私有数据。它即为apue中的“打开文件描述符表”。

(2) fs_structfs_struct 结构描述进程与文件系统的关系。

这些对象的关系如下图所示。

 

0.3 Apue文件对象解读

再来看一下apue中描述的关于文件和进程的关系,如下图( 3-1显示了进程的三张表之间的关系。该进程有两个不同的打开文件一个文件打开为标准输入(文件表述符0),另一个打开为标准输出(文件描述符1)

 

1)每个进程在进程表中都有一个记录项(打开文件描述符表),记录项中包含有一张打开文件的描述符表,可将其视为一个矢量,每个描述符占用一项。

  &nb