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

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

·       文件描述符标志close_on_exec)。

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

注解:这里描述的即为Linux进程描述符(tast_struct)中的filesfiles_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对象描述符数。(dupfork都会增加这个计数,第一次open会使此计数为1close会减小此计数,为0时销毁file对象)

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

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

扩展:

1close_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; /*创建时间*/
};

目录
相关文章
|
2月前
|
存储 数据管理 Linux
区分Linux中.tar文件与.tar.gz文件的不同。
总之,".tar"文件提供了一种方便的文件整理方式,其归档但不压缩的特点适用于快速打包和解压,而".tar.gz"文件通过额外的压缩步骤,尽管处理时间更长,但可以减小文件尺寸,更适合于需要节约存储空间或进行文件传输的场景。用户在选择时应根据具体需求,考虑两种格式各自的优劣。
383 13
|
3月前
|
安全 Linux
Linux赋予文件000权限的恢复技巧
以上这些步骤就像是打开一扇锁住的门,步骤看似简单,但是背后却有着严格的逻辑和规则。切记,在任何时候,变更文件权限都要考虑安全性,不要无谓地放宽权限,那样可能
127 16
|
3月前
|
存储 Linux 数据处理
深入剖析Linux中一切即文件的哲学和重定向的机制
在计算机的奇妙世界中,Linux的这套哲学和机制减少了不同类型资源的处理方式,简化了抽象的概念,并蕴藏着强大的灵活性。就像变戏法一样,轻轻松松地在文件、程序与设备之间转换数据流,标准输入、输出、错误流就在指尖舞动,程序的交互和数据处理因此变得既高效又富有乐趣。
55 4
|
4月前
|
Web App开发 Linux 程序员
获取和理解Linux进程以及其PID的基础知识。
总的来说,理解Linux进程及其PID需要我们明白,进程就如同汽车,负责执行任务,而PID则是独特的车牌号,为我们提供了管理的便利。知道这个,我们就可以更好地理解和操作Linux系统,甚至通过对进程的有效管理,让系统运行得更加顺畅。
124 16
|
4月前
|
Ubuntu Linux
"unzip"命令解析:Linux下如何处理压缩文件。
总的来说,`unzip`命令是Linux系统下一款实用而方便的ZIP格式文件处理工具。本文通过简明扼要的方式,详细介绍了在各类Linux发行版上安装 `unzip`的方法,以及如何使用 `unzip`命令进行解压、查看和测试ZIP文件。希望本文章能为用户带来实际帮助,提高日常操作的效率。
588 12
|
3月前
|
Linux
linux文件重命名命令
本指南介绍Linux文件重命名方法,包括单文件操作的`mv`命令和批量处理的`rename`命令。`mv`可简单更改文件名并保留扩展名,如`mv old_file.txt new_name.txt`;`rename`支持正则表达式,适用于复杂批量操作,如`rename 's/2023/2024/' *.log`。提供实用技巧如大小写转换、数字序列处理等,并提醒覆盖风险与版本差异,建议使用`-n`参数预览效果。
|
3月前
|
监控 Shell Linux
Linux进程控制(详细讲解)
进程等待是系统通过调用特定的接口(如waitwaitpid)来实现的。来进行对子进程状态检测与回收的功能。
76 0
|
3月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
108 0
|
3月前
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
68 0
|
3月前
|
Linux 调度 C语言
Linux进程概念-详细版(一)
子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。
77 0

热门文章

最新文章