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

目录
相关文章
|
15天前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
46 4
linux进程管理万字详解!!!
|
5天前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
42 8
|
8天前
|
Linux 开发工具 Perl
在Linux中,有一个文件,如何删除包含“www“字样的字符?
在Linux中,如果你想删除一个文件中包含特定字样(如“www”)的所有字符或行,你可以使用多种文本处理工具来实现。以下是一些常见的方法:
32 5
|
8天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
26 6
|
8天前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
34 6
|
9天前
|
监控 Linux Perl
Linux 命令小技巧:显示文件指定行的内容
在 Linux 系统中,处理文本文件是一项常见任务。本文介绍了如何使用 head、tail、sed 和 awk 等命令快速显示文件中的指定行内容,帮助你高效处理文本文件。通过实际应用场景和案例分析,展示了这些命令在代码审查、日志分析和文本处理中的具体用途。同时,还提供了注意事项和技巧,帮助你更好地掌握这些命令。
23 4
|
14天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
47 4
|
15天前
|
网络协议 Linux
linux系统重要文件目录
本文介绍了Linux系统中的重要目录及其历史背景,包括根目录、/usr、/etc、/var/log和/proc等目录的结构和功能。其中,/etc目录下包含了许多关键配置文件,如网卡配置、DNS解析、主机名设置等。文章还详细解释了各目录和文件的作用,帮助读者更好地理解和管理Linux系统。
39 2
|
14天前
|
缓存 监控 Linux
|
4月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能