根据文件路径查找索引节点

操作系统的文件管理系统的主要作用就是,当用户需要访问一个文件时,系统可以通过用户给出的文件路径找到文件的索引节点,从而找到文件,并以文件对象的实例交付给用户进程。下面就以系统调用open()为例来说明文件的查找过程,以加深对文件系统的理解和认识。

系统调用open()的内核函数为sys_open(),下图描述了用户进程调用系统调用open()的整个流程:

sys_open()系统调用打开或创建一个文件,成功后,返回该文件的文件描述符。下图是sys_open()实现代码中主要的函数调用关系图:

sys_open()

从sys_open()的函数调用关系图可以看出,sys_open()在做了一些简单的参数检验后,就接着调用do_sys_open(),在该函数中:

  • get_unused_fd()得到一个可用的文件描述符。通过该函数,可知文件描述符实质上是进程打开文件列表中对应某个文件对象的索引值;
  • do_filp_open()打开文件,返回一个file对象,代表由该进程打开的一个文件。进程通过这样的一个数据结构对物理文件进行读写操作;
  • fd_install()建立文件描述符与file对象的联系,以后进程对文件的读写都是通过操作该文件描述符而进行的。

do_filp_open()

do_filp_open()用于打开文件,返回一个file对象;而打开之前需要先找到该文件。

open_namei()用于根据文件路径名查找文件,借助一个持有路径信息的数据结构nameidata而进行;

查找结束后,将填充有路径信息的nameidata返回给接下来的函数nameidata_to_filp(),从而得到最终的file对象。当达到目的后,nameidata这个数据结构会马上被释放。

open_namei()

open_namei()用于查找一个文件。

path_lookup_open()实现文件的查找工作。要打开的文件若不存在,还需要一个新建的过程,则调用path_lookup_create(),后者和前者封装的是同一个实际的路径查找函数,只是参数不一样,使它们在处理细节上有所偏差;

当以创建文件的方式打开文件时,即设置了O_CREAT标识时,需要创建一个新的索引节点,代表创建一个文件。由vfs_create()里面的一句核心语句:

dir->i_op->create(dir, dentry, mode, nd);

它调用了具体的文件系统所提供的创建索引节点的方法。注意,这里的索引节点的概念,还只是位于内存中。只有把它写入磁盘才是一个物理文件的真正创建;

path_to_nameidata()填充nameidata数据结构;

may_open()检查是否可以打开该文件。

__path_lookup_intent_open()

不管是path_lookup_open()还是path_lookup_create(),最终都是调用__path_lookup_intent_open()来实现查找文件的功能。

查找时,会遍历路径的过程中,会逐层地将各个路径组成部分解析成目录项对象。如果此目录项对象在目录项缓存中,则直接从缓存中获取;如果该目录项在缓存中不存在,则进行一次实际的读盘操作,从磁盘中读取该目录项所对应的索引节点。得到索引节点之后,则建立索引节点与该目录项的联系。如此循环,直到找到目标文件对于的目录项,也就找到了索引节点,而由索引节点找到对应的超级块对象,就可知道该文件所在的文件系统的类型。

知道了文件系统的类型,VFS就能调用这个文件系统相对应的索引节点操作函数集来进行操作。

从磁盘中读取该目录项对应的索引节点;将引发VFS和实际的文件系统的一次交互。

进程创建时文件的复制与共享

之前讲到:当一个进程系统调用fork()创建一个子进程时,fork()将调用内核函数do_fork()对父进程的进程控制块进行复制,并将这个副本作为子进程的控制块。如果父进程有已经打开的文件,那么子进程理所当然的按某种方式来继承这些文件。为此,do_fork()中有以下这样的一段决定子进程在文件方面的继承方式:

if(copy files(clone_flags, p))goto bad_fork_clcanup;
if(copy fs(clone_flags, p))goto bad_fork_clcanup_files;

其中,copy files()就是用来处理父进程已打开文件的函数。该函数根据参数clone_flags的设置位来决定子进程以何种方式来继承父进程的打开文件。

  • 当clone_flags中的CLONE_FILES标志为0时,函数copy files()将复制父进程控制块中已打开文件的整个控制结构。这是虽然父子进程使用同一组被打开文件,但各自在自己的文件上下文中工作;
  • 当clone_flags中的CLONE_FILES标志非0时,函数copy files()只是简单地把父进程控制块中的files指针复制到子进程控制块,同时将file_struct结构中的共享计数成员加1,以表明文件又多了一个使用者,即子进程只是通过指针与父进程共享同一组打开文件。

函数copy fs()只是用来处理fs_struct结构的,类似的,这个结构也是根据其参数clone_flags决定子进程是以复制还是共享方式继承父进程的fs_struct结构的。

【Linux】Linux根据文件路径查找索引节点相关推荐

  1. SpringBoot部署项目到Linux上传文件路径问题

    SpringBoot部署项目到Linux上传文件路径问题 使用项目相对路径上传到话会上传到linux服务器到/tmp 临时文件目录中,但是问题是还会报异常 Caused by: java.io.Fil ...

  2. 在linux中的文件中查找_如何在Linux中查找文件

    在linux中的文件中查找 如果您是Windows用户或OSX的非超级用户,则可能使用GUI查找文件. 您可能还会发现界面有限,令人沮丧或两者兼而有之,并且学会了精于组织事物并记住文件的确切顺序. 您 ...

  3. linux服务器上的项目读取本地文件,java访问linux服务器读取文件路径

    java访问linux服务器读取文件路径 内容精选 换一换 通过ADC将文件传输到Host.参见准备环境完成环境配置.以运行用户登录安装Toolkit组件的服务器.执行命令,将A.java文件传输到H ...

  4. java 到服务器上读文件路径,java访问linux服务器读取文件路径

    java访问linux服务器读取文件路径 内容精选 换一换 通过ADC从Host获取文件.参见准备环境完成环境配置.以运行用户登录安装Toolkit组件的服务器.执行命令,从Host获取B.java, ...

  5. 如何向linux中添加头文件,linux添加头文件路径

    gcc demo.c -o demo  -I/tools/libevent/include -L/tools/libevent/lib -levent -I:头文件目录 -L:静态库目录 -l:静态库 ...

  6. 快速容易地处理Windows、Mac 和Linux系统中文件路径问题

    作者:景略集智 链接:https://www.zhihu.com/question/48755767/answer/423475686 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  7. python中的glob 模块学习文件路径查找

    glob glob.glob(pathname), 返回所有匹配的文件路径列表.它只有一个参数pathname,定义了文件路径匹配规则,这里可以是绝对路径,也可以是相对路径. import glob ...

  8. Python模块学习:glob 文件路径查找

    文章转载自<伯乐在线>原文出处: Darkbull Python模块学习:glob 文件路径查找 glob模块是最简单的模块之一,内容非常少.用它可以查找符合特定规则的文件路径名.跟使用w ...

  9. linux的库文件路径,Linux下的库文件搜索路径

    对于以压缩包发布的软件,在它的目录下通常都有一个配置脚本configure,它的作用确定编译参数(比如头文件位置.连接库位置等),然后生成Makefile以编译程序.可以进入该软件的目录,执行&quo ...

  10. Linux - Linux下Java安装路径查找;配置Java环境变量

    一.查看Java的安装路径 1.已经安装好了JDK,也配置了环境变量 1.执行 java -version java -version 出现了版本号,表示安装过了JDK,配置了环境变量 2.在配置过j ...

最新文章

  1. Spark出现java.lang.stackoverflowerror的解决方法
  2. 微信小程序 - vant popup弹出层阻止底层页面滑动
  3. Tkinter中常用的函数
  4. Anaconda-- conda 创建、激活、退出、删除虚拟环境
  5. android复制图片,android图像保存到res / drawable文件夹[复制]
  6. oauth password模式_SpringBoot OAuth2.0 认证授权(密码模式)
  7. 51单片机程序下载、ISP及串口基础知识
  8. slide简介(大数据技术)
  9. 商家 APP 如何接入新版支付宝支付,老版本商家如何升级
  10. mysql 主从 均衡_Mysql主从复制
  11. idea使用过程中的坑
  12. 多态在 Java 和 C++ 编程语言中的实现比较
  13. linux hdmi /dev/fb操作,HDMI接口学习笔记
  14. 为了防止世界被破坏,春运的抢票攻略在等着你们
  15. 软件测试使用linux做什么?
  16. 大数据开发和java的前景_大数据开发和javaEE后端开发哪个就业前景好?
  17. 从零开始学C语言 : 初阶指针
  18. Hyper-v功能开启及安装Linux虚拟机
  19. Linux_Shell脚本 + 配置文件:按照不同文件类型合并文件,小文件合并成大文件
  20. 创业者必知的互联网思维之用户思维

热门文章

  1. xp大容量u盘补丁_老电脑上大硬盘补丁
  2. 工程控制论 理论概况
  3. 《数据结构》算法与算法设计
  4. c语言入门经典+第5版+习题答案,《C语言入门经典(第5版)》—甲虎网一站式图书批发平台...
  5. 数学分析:Taylor多项式
  6. STM32基于TFTP固件升级经验分享
  7. iPhone路径大全
  8. Ubuntu 安装gcc/g++
  9. xp系统internet信息服务器地址,XP系统下Internet信息服务IIS的安装方法
  10. POI数据获取-Python