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

  • 时间:
  • 浏览:1
  • 来源:彩神快乐8_神彩快乐8官方

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

注:绿色累积为tcp连接1的私有资源,黄色累积为tcp连接2的私有资源,深紫色 累积为tcp连接1、tcp连接2的共享资源。

扩展

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

第一一六个多多tcp连接写入后,文件(i节点)的偏移由于改变,第六个tcp连接再写会覆盖第一一六个多多tcp连接刚写的内容。要是用O_APPENDopen,会使内核每次对文件写后后,都将tcp连接的当前偏移量(file对象中的)设置到文件的尾端处(i节点的当前文件长度)。

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

由于一一六个多多多独立tcp连接本人 打开了同一文件,则有图3-2中所示的安排。一点人 假定第一一六个多多tcp连接使该文件在文件描述符3上打开,而原本tcp连接则使此文件在文件描述符4上打开。打开此文件的每一一六个多多tcp连接都得到一一六个多多多文件对象但对一一六个多多多给定的文件不需要 一一六个多多多v节点表项。每个tcp连接也有另一方的文件对象的一一六个多多多理由:你一点安排使每个tcp连接也有它另一方对该文件的当前位移量你一点情况报告不需要增加对应的打开文件引用计数,而会增加dentry的引用。

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

总结:一一六个多多多独立tcp连接打开同一文件,对应不同的file对象,每个tcp连接调用close只影响本tcp连接的“打开文件计数”(file对象的引用计数)。

注意对于多个tcp连接打开同一文件的情况报告,每个tcp连接也有它另一方的文件表项file对象),其带有它另一方的文件位移量,很多对于多个tcp连接读同一文件都能正确工作。一点,当多个tcp连接写同一文件时,则由于产生预期不需要 的结果。(都不需要 使用preadpwrite)。

1leek定位到当前文件尾端,在向文件写入(write)与使用O_APPEND打开(open)文件再写入(write)的区别:

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

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

前者是“非原子”操作,假若一一六个多多tcp连接都使用前者的办法向文件结尾写入数据,不需要 有由于产生原本的调度序列:

tcp连接Aleek  tcp连接Bleek tcp连接Awrite tcp连接Bwrite