每个进程都有自己的根目录和当前工作目录,内核使用struct fs_struct来记录这些信息,进程描述符的fs字段便是指向该进程的fs_struct结构。

fs_struct 定义于 include/linux/fs_struct.h 。

struct fs_struct {int users;spinlock_t lock;seqcount_t seq;int umask;int in_exec;struct path root, pwd;};

除了根目录和当前工作目录,进程还需要记录自己打开的文件。进程已经打开的所有文件使用struct files_struct来记录,进程描述符的files字段便指向该进程的files_struct结构。

files_struct 定义于 include/linux/fdtable.h.

struct files_struct {/** read mostly part*/atomic_t count;bool resize_in_progress;wait_queue_head_t resize_wait;struct fdtable __rcu *fdt;struct fdtable fdtab;/** written part on a separate cache line in SMP*/spinlock_t file_lock ____cacheline_aligned_in_smp;int next_fd;unsigned long close_on_exec_init[1];unsigned long open_fds_init[1];struct file __rcu * fd_array[NR_OPEN_DEFAULT];
};

由于NR_OPEN_DEFAULT在x86结构下的定义为32,在ia64结构下的定义为64,所以说,fd_array最多只能存储32或64个文件对象,远远小于进程被允许打开的最大文件数NR_OPEN, 如果超过了NR_OPEN_DEFAULT, 多出来的文件对象将如何存储呢?

显然,内核必须分配新的存储空间存放这些文件对象的指针。旧版本的内核中,struct file_struct中有一个fd字段,指向文件对象的指针数组。通常fd指向fd_array,如果进程打开的文件数目多于32个,内核就分配一个新的更大的文件对象的指针数组,并将其地址存放在fd字段中,这个数组所包含的元素数目存放在max_fds字段。

新版本的内核将fd,max_fds以及其他几个相关字段组织在一起,增加一个新的独立数据结构struct fdtable,成为文件描述符表,其主要数据结构定义如下所示:

fdtable 定义于 include/linux/fdtable.h 。

struct fdtable {unsigned int max_fds;struct file __rcu **fd;      /* current fd array */unsigned long *close_on_exec;unsigned long *open_fds;struct rcu_head rcu;
};

原文链接:https://mudongliang.github.io/2015/10/25/linuxvfs-6.html

fs_struct和file_struct关系相关推荐

  1. linux操作系统 第07章 磁盘管理

    第7章   文件管理 7.1  文件管理概述 7.1.1  文件与文件系统 1. 文件 文件是具有名字的一组相关信息的有序集合,存放在外部存储器中.文件的名字称为文件名,它是文件的标识.文件的信息可以 ...

  2. [转]文件IO详解(二)---文件描述符(fd)和inode号的关系

    原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...

  3. Linux 内核文件系统模块结构体关系图

    导言 很久没有更新csdn博客了,工作两年,学习了不少新东西,很多都没有来的及整理,用过不久很快就忘记了,写到博客中做个记录. 关系图 下图为去年学习文件系统时所画,有参考网上其他博主的资料,也有自己 ...

  4. Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系

    一:文件系统 1. 什么是文件系统? 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统. 通常文件系统是用于存储和组织文件的一种机制,便于对文件进行方便的查找与访问. 文件系统 ...

  5. [IO系统]06 因OPEN建立的结构体关系

    前述章节已经说明了open是如何打开文件的,本章节将说明open打开文件的过程中初始化了哪些结构体及这些结构体之间建立的联系 1.1   各结构体之间的关系图 如下图: 接下来一步一步来说明. 1.2 ...

  6. Linux shell 学习笔记(3)— shell 父子关系及内建命令

    1. shell 类型 只要用户登录到某个虚拟控制台终端或是在 GUI 中启动终端仿真器,默认的 shell 程序就会开始运行. 默认的交互 shell 会在用户登录某个虚拟控制台终端或在 GUI 中 ...

  7. 知识图谱中传统关系抽取方法

    目前主要采用统计机器学习的方法,将关系实例转换成高 维空间中的特征向量或直接用离散结构来表示,在标注语 料库上训练生成分类模型,然后再识别实体间关系  基于特征向量方法 最大熵模型(Kambhatl ...

  8. 用男女朋友关系解释计算机常用概念

    运维方面 很多同学对热备,冷备,云备了解不深,我科普一下 IT 行业各种备份术语.以后别闹笑话了. 假设你是一位女性,你有一位男朋友,于此同时你和另外一位男生暧昧不清,比朋友好,又不是恋人.你随时可以 ...

  9. 与人相处时不越界,能让关系更和谐

    在这世上,我们每天都要与人相处:与人相处是一门学问,需要把握一个界限,当你过度的想要保持距离时,会让对方感觉你不近人情:而当你过度的亲密不拿自己当外人时,又可能是越界了. 每个人都有自己的朋友圈子和生 ...

最新文章

  1. kafka 批量 回写mysql_kafka往mysql写数据操作笔记
  2. 有没有简单优雅的方法来定义单例? [重复]
  3. 【附可运行代码】剑指 Offer 16. 数值的整数次方
  4. 最优化课程笔记07——约束问题的非线性规划方法(重点:拉格朗日乘子法和惩罚函数法)
  5. Leetcode怎么调试java代码,LeetCode–正则表达式匹配
  6. pytorch 向量转化为one-hot编码
  7. 为不干活的员工辩护,要小心
  8. dss linux 摄像头 rtsp,[转载]DSS Linux 安装
  9. BS7799(ISO17799:2000)
  10. 最全静态网页模板网站
  11. java代码实现乘法口诀表
  12. 点到直线的距离公式: 一元微积分
  13. 致远oa wpsassistservlet任意文件上传漏洞
  14. Springboot 通过Jedis-clients 操作Redis
  15. WTP 线程池管理系统,修改配置后能够实时刷新
  16. vue+element+上传图片插件
  17. 【中国大学MOOC】java程序设计-week3-用“埃氏筛法”求2~100以内的素数
  18. Java接口及接口继承
  19. 生产管理ERP软件系统的主要功能有哪些?
  20. iOS APP图标一键生成

热门文章

  1. 如何查看python安装了什么库-怎么看python安装了哪些库
  2. 关于python中requests模块导入问题-python引入requests模块报错
  3. 自学python推荐书籍 知乎-在知乎上学 Python - 爬虫篇
  4. arcgis的python脚本-在ArcGIS中写python脚本读取shapefile
  5. 学python有哪些书推荐-学python看什么书好?求推荐
  6. python官方网站是-Python基础
  7. php 动态彩码辨色 接口的调用_好用的云函数!后端低代码接口开发,零基础编写API接口...
  8. LeetCode209 长度最小的子数组(二分法)
  9. Qt中用ODBC连接excel中文乱码问题
  10. AlertDialog的使用(二):分别创建