the data structures used by the kernel for all I/O

以下的描述是概念性的,它可能符合或者不符合一个特定的实现。


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


1、每个进程在其进程表中都有一个记录项,记录项中包含有一张该进程打开文件描述符表。我们可以将它看做是一个vector,每条记录对应一个描述符。与每个文件描述符相关联的是:

a) 文件描述符标志(The file descriptor flags) 

b) 一个指向文件表条目的指针(A pointer to a file table entry)


2、内核为所有打开的文件维护一张文件表。每个文件表条目包含

a) 文件状态标志(The file status flags for the file)

b) 当前文件偏移量(The current file offset)

c) 指向该文件v-node表条目的指针(A pointer to the v-node table entry for the file)


3、每个打开的文件(或设备)都有一个v-node结构,它用于包含文件类型,在文件上操作的函数指针这些信息。对于大多数文件,v-node同时包含一个该文件的i-node。当文件被打开时,这个信息会从磁盘上被读取,该文件所有相关的信息也会很容易被获取。




对于两个独立的进程同时打开一个文件,则会有下面的安排:



我们在这假设第一个进程在文件描述符3上打开这个文件,第二个进程在文件描述符4上打开这个文件。每个打开文件的进程有它自己的文件表条目,但是对于一个给定的文件只需要一个v-node表条目。每个进程都有它自己的文件表条目的一个原因,就是每个进程都有它对于这个文件的偏移量。

给出这些数据结构后,我们对以下操作进行更深入的说明:

1、每个write完成后,在文件表条目中的偏移量就会增加所写的字节数。如果引起当前文件偏移量超过文件大小,那么在i-node中的当前文件大小将会被设置成当前文件偏移量。

2、如果一个文件使用O_APPEND标志打开,那么一个对应的标志将会在文件表条目中的文件状态标志中被设置。每次对一个文件运行write时,在文件表条目中的当前文件偏移量会首先设置成i-node中的当前文件大小的值。这使得使每次write都会写到文件尾。

3、如果一个文件通过lseek被定位到当前文件尾部,那么就会发生:文件表条目中的当前文件偏移量被设置成i-node中的当前文件大小。(注意,这与通过O_APPEND标志打开一个文件并不一样)。

4、lseek函数只是修改文件表条目中的当前文件偏移量,并没有I/O发生。


【备注】

1、多于一个文件描述符条目指向同一个文件表条目是可能的。可以通过dup函数实现。经过fork()后,父子进程对于每隔一文件都会共享相同的文件表条目。

2、注意文件描述符标志(file descriptor flags)和文件状态标志(file status flags)作用于的区别。前者适用于单个进程内的单个文件,后者适用于指向该给定文件表条目的任何进程中的所有描述符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值