Linux文件共享(二)——两个独立进程打开同一个文件
2014-05-25 14:34
309 查看
如果两个独立进程各自打开了同一文件,则有图3-2中所示的安排。我们假定第一个进程使该文件在文件描述符3上打开,而另一个进程则使此文件在文件描述符4上打开。打开此文件的每一个进程都得到一个文件对象,但对一个给定的文件只有一个v节点表项。每个进程都有自己的文件对象的一个理由:这种安排使每个进程都有它自己对该文件的当前位移量。这种情况不会增加对应的打开文件引用计数,而会增加dentry的引用。
给出了这些数据结构后,现在对前面所述的操作作进一步说明。转载请尊重原创、保留相关链接本文来自多宝平台
:http://www.mbodb.com
(1) 在完成每一个write后,在文件表项中的当前文件位移量即增加所写的字节数。如果这使当前文件位移量超过了当前文件长度,则在i节点表象中的当前文件长度被设置为当前文件位移量(也就是该文件加长了)。
(2) 如果用O_APPEND标志打开一个文件,则相应标志也被设置到文件表项(file对象)的文件状态标志中。每次对这种具有填写标志的文件执行写操作时,在文件表项中的当前文件位移量首先被设置为i节点表项中的文件长度。这就使得每次写的数据都添加到文件的当前尾端处。
(3) lseek值修改文件表项中的当前文件位移量,没有进行任何I/O操作。(不影响i节点,只影响file对象,详细分析请见lvyilong316博客:空洞文件)
(4) 若一个文件用lseek被定位到文件当前的尾端,则文件表项中的当前文件位移量被设置为i节点表项中的当前文件长度。
将图3-2转化为linux下的具体实现,如下图所示。
注:绿色部分为进程1的私有资源,多宝黄色部分为进程2的私有资源,蓝色部分为进程1、进程2的共享资源。
扩展:
(1)用leek定位到当前文件尾端,在向文件写入(write)与使用O_APPEND打开(open)文件再写入(write)的区别:
前者是“非原子”操作,假如两个进程都使用前者的方式向文件结尾写入数据,那么有可能产生这样的调度序列:
进程A:leek 进程B:leek 进程A:write 进程B:write
第一个进程写入后,文件(i节点)的偏移已经改变,第二个进程再写会覆盖第一个进程刚写的内容。而是用O_APPEND的open,会使内核每次对文件写之前,都将进程的当前偏移量(file对象中的)设置到文件的尾端处(i节点的当前文件长度)。
注意:对于多个进程打开同一文件的情况,每个进程都有它自己的文件表项(file对象),其中有它自己的文件位移量,所以对于多个进程读同一文件都能正确工作。但是,当多个进程写同一文件时,则可能产生预期不到的结果。(可以使用pread,pwrite)。
总结:两个独立进程打开同一文件,对应不同的file对象,每个进程调用close只影响本进程的“打开文件计数”(file对象的引用计数)。
给出了这些数据结构后,现在对前面所述的操作作进一步说明。转载请尊重原创、保留相关链接本文来自多宝平台
:http://www.mbodb.com
(1) 在完成每一个write后,在文件表项中的当前文件位移量即增加所写的字节数。如果这使当前文件位移量超过了当前文件长度,则在i节点表象中的当前文件长度被设置为当前文件位移量(也就是该文件加长了)。
(2) 如果用O_APPEND标志打开一个文件,则相应标志也被设置到文件表项(file对象)的文件状态标志中。每次对这种具有填写标志的文件执行写操作时,在文件表项中的当前文件位移量首先被设置为i节点表项中的文件长度。这就使得每次写的数据都添加到文件的当前尾端处。
(3) lseek值修改文件表项中的当前文件位移量,没有进行任何I/O操作。(不影响i节点,只影响file对象,详细分析请见lvyilong316博客:空洞文件)
(4) 若一个文件用lseek被定位到文件当前的尾端,则文件表项中的当前文件位移量被设置为i节点表项中的当前文件长度。
将图3-2转化为linux下的具体实现,如下图所示。
注:绿色部分为进程1的私有资源,多宝黄色部分为进程2的私有资源,蓝色部分为进程1、进程2的共享资源。
扩展:
(1)用leek定位到当前文件尾端,在向文件写入(write)与使用O_APPEND打开(open)文件再写入(write)的区别:
前者是“非原子”操作,假如两个进程都使用前者的方式向文件结尾写入数据,那么有可能产生这样的调度序列:
进程A:leek 进程B:leek 进程A:write 进程B:write
第一个进程写入后,文件(i节点)的偏移已经改变,第二个进程再写会覆盖第一个进程刚写的内容。而是用O_APPEND的open,会使内核每次对文件写之前,都将进程的当前偏移量(file对象中的)设置到文件的尾端处(i节点的当前文件长度)。
注意:对于多个进程打开同一文件的情况,每个进程都有它自己的文件表项(file对象),其中有它自己的文件位移量,所以对于多个进程读同一文件都能正确工作。但是,当多个进程写同一文件时,则可能产生预期不到的结果。(可以使用pread,pwrite)。
总结:两个独立进程打开同一文件,对应不同的file对象,每个进程调用close只影响本进程的“打开文件计数”(file对象的引用计数)。
相关文章推荐
- Linux文件共享(二)——两个独立进程打开同一个文件
- Linux文件共享(二)——两个独立进程打开同一个文件
- Linux下两个进程可以同时打开同一个文件,这时如下描述错误的是:
- WinForm/C#中打开一个文件,主要是用到进程的知识。
- 查看一个进程打开了哪些文件的命令
- 解决Excel 2010打开两个以上文件时,总只显示一个窗口
- 一个进程能够打开最大文件句柄数设到多大才合适(Linux)
- 进程间通信--两个进程操作同一个文件
- 查看一个进程打开了哪些文件的命令
- 一个进程对一个文件加写锁后,另一个进程对相同的文件仍可以以读的模式打开,但是再次加写锁失败。
- C#_WinForm_打开一个进程、文件等.
- 一个进程能够打开最大文件句柄数设到多大才合适(Linux) (转)
- 如何查看一个进程打开哪些fd及对应的文件或套接字操作
- 编写两个不同的可执行程序,一个打开文件,一个读文件
- ★实验 8-1 1. 创建一个守候进程。并为自己创建独立的日志文件。 2. 每隔 1s 向日志文件中写入如下信息: a) 未使用的内存大小(MemFree) 可以从/proc/meminf
- IE8打开一个网页出现两个进程的解决方案
- 如何打开 两个Editplus(窗口 进程),不想在一个窗口多标签打开程序,这样子很难对比程序
- 在WinForm/C#中打开一个文件,主要是用到进程的知识。
- 如何查看一个进程打开了哪些文件?
- MyEclipse2014中如何设置jsp文件打开后显示一个框里两个页面,上面是图,下面是代码