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

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

0.1和文件有关的对象

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

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

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

0.2和进程有关的对象

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

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

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

 

0.3 Apue文件对象解读

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

 

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

   每个文件描述符相关连的是:

·       文件描述符标志(close_on_exec)。

·       指向一个文件表项的指针。

注解:这里描述的即为Linux进程描述符(tast_struct)中的files(files_struct类型)。

(2)内核为所有打开文件维持一张文件表。每个文件表项包含:

·        文件状态标志(包含读写,填写,同步,非阻塞等)

·        当前文件偏移量

·        指向该文件v节点表项的指针。

注解:这里描述的“文件表项”即为linux系统下的文件对象(file)。

(3)每个打开的文件都有一个v节点结构。v节点包含了文件类型和对此文件进行各种操作的函数的指针。对于大多数文件,v节点还包括了该文件的i节点。这些信息是再打开文件时从磁盘上读入内存的。这些文件都是从磁盘读入内存的,所以可以快速使用这些参数。

注解:这里描述的v节点,在linux中即为i节点,对应inode对象。

之后我们的讨论也主要围绕这三大对象。      

0.4 引用计数

在我们讨论的几个和文件有关的对象中都存在引用计数,而他们的含义各不相同,理解这些引用计数对我们下面的讨论至关重要。

(1) file_struct引用计数:表明共享此结构的进程(线程)数。(我们讨论线程共享文件会用到)

(2) fs_struct引用计数:表明共享此结构的进程(线程)数。(我们讨论线程共享文件会用到)

(3) file对象引用计数:打开文件引用计数,引用这个file对象描述符数。(dup和fork都会增加这个计数,第一次open会使此计数为1,close会减小此计数,为0时销毁file对象)

(4) dentry引用计数:每一个计数对应一个file对象。

(5) inode引用计数:每一个计数对应一个dentry。

扩展:

(1)close_on_exec标志

从图中可见,这个标着在进程的files_struct中, 是一个进程所有文件描述符(文件句柄)的位图标志,每个比特位对应一个打开的文件描述符,用于确定在调用系统调用execve()时需要关闭的文件描述符,可用fcntl设置。

(2)附录:i节点结构

struct dinode
{
 ushort di_mode;  /*文件类型+用户权限*/
 short di_nlink;  /*文件链接数*/
 ushort di_uid;  /*属主用户id*/
 ushort di_gid;  /*属主用户组id*/
 off_t di_size;  /*文件大小*/
 char di_addr[40]; /*文件数据区起点地址*/
 time_t di_atime; /*最后访问时间*/
 time_t di_mtime; /*最后修改时间*/
 time_t di_ctime; /*创建时间*/
};

时间: 2024-12-13 09:49:14

Linux文件共享(一)——进程与打开文件的相关文章

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

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

linux打开文件数量问题

too many open files 出现这句提示的原因是程序打开的文件/socket连接数量超过系统设定值. 查看每个用户最大允许打开文件数量 ulimit -a fdipzone@ubuntu:~$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 20 file size (blocks, -f) unlimited pending s

win7电脑如何设置以单独进程打开文件夹

  在此之前,我们先来解释一下,什么叫做以单独进程打开文件夹,撇开这种专业术语,咱们用比较通俗的话来解释,其实就是咱们没打开一个文件夹,都会以新窗口的形式出来,而不会覆盖在原有的窗口中,虽然说很多人觉得这种方式有些浪费空间了,但是实际上,相对而言,这种打开的方式使用起来会更加的方便,但是目前的win7系统下载官网设置,似乎不是以单独进程的形式来打开文件夹的,咱们是否可以手动来进行更改呢?下面,小编就来介绍一下如何操作吧! 1.首先,咱们单击键盘上的windows图标或者是直接鼠标点击屏幕左下角的

如何在win7电脑中使用单独进程打开文件夹?

  其实咱们很少会在操作中用到这种方法,因为咱们一般打开文件夹,就是直接的双击打开,但是大家是否有想过,有的时候打开一个文件夹出现故障,造成系统的假死,同时也会影响到其他的文件夹,而这个时候,咱们使用单独进程打开文件夹则是最好也是最为保险的方式,那么如何才能实现在win7旗舰版中使用单独进程打开文件呢?下面小编就为大家讲述一下吧! 1.首先,咱们还是返回到win7电脑的桌面位置,然后找到计算机图标并双击,这样就可以打开咱们电脑的资源管理器窗口了. 2.咱们单击资源管理器窗口上方任务栏中的组织,然

Linux文件共享(六)——描述符传递

注:转载请注明出处   作者:lvyilong316 5.1 进程间描述符传递 首先,我们先来讨论一个问题--进程间传递文件描述符究竟传递的是什么? 我们从传递描述符函数的参数来看是个fd,我们知道fd是打开文件指针的在数组中的下标,是一个整数,那么我们仅仅是把一个整数传递给另一个进程吗?答案肯定是否定的,因为仅仅是传递整数值,没有必要专门去实现一个api.至于深层次的的原因,我们可以想一下,假如接受进程仅仅收到的是一个整数值,他能知道什么,又能做什么呢?即使它知道这是来自另一个进程的一个打开文

win8打开文件总会遇到无反应现象的原因及解决方法

  1.打开传统桌面,打开计算机中任意一个磁盘,然后选择选项调出文件夹选项; 2.在文件夹选项中切换至查看选项卡,勾选在单独的进程中打开文件夹窗口; 3.随意选择一个文件夹右击选择属性---常规---高级,打开设置窗口; 4.取消"除了文件属性外,还允许索引此驱动器文件的内容"前面的对勾即可.

Win8/Win8.1打开文件夹时假死怎么办?

  思路一:关闭Windows Defender 如果你没有安装第三方防护软件,系统会默认开启自带的Windows Defender的,默认情况下,扫描文件时会占用大量的系统资源并会造成打开文件夹时假死;如果安装有其他防护软件,Windows Defender应该会自己关闭,如果没有关闭在服务中关闭"Windows Defender Service"服务即可. 如果你只想使用Windows Defender作为基础防护的话,就需要设定特例了: 打开Windows Defender,点击

windows8.1打开文件夹就卡死(假死)的处理方法

  思路一:重启桌面窗口管理器 1.按键盘的"Ctrl+Alt+Del"组合键,打开"任务管理器",在"进程"选下卡找到"桌面窗口管理器",结束之; 2.此时桌面会变成只有背景的状态,继续在任务管理器中选择"文件"菜单下的"运行新任务"; 3.输入"explorer"后回车,系统会重新启动桌面窗口管理器; 需要注意使用这种方法会将已经打开的文件夹关闭,需要再次打开,如

Win7打开文件夹时假死的解决办法

  思路一:关闭Windows Defender 如果你没有安装第三方防护软件,系统会默认开启自带的Windows Defender的,默认情况下,扫描文件时会占用大量的系统资源并会造成打开文件夹时假死;如果安装有其他防护软件,Windows Defender应该会自己关闭,如果没有关闭在服务中关闭"Windows Defender Service"服务即可. 如果你只想使用Windows Defender作为基础防护的话,就需要设定特例了: 打开Windows Defender,点击