Linux-2.6 文件打开过程涉及数据结构分析:

原文链接 : http://blog.csdn.net/ordeder/article/details/24420637

用户层面

文件打开的结构为:

fd = open(path,flag,mode)

内核层面

open函数内陷到内核空间后,做了以下操作:

1. 找一个空闲的fd

进程打开一个文件,需要消耗该进程的一个文件描述符fd,该fd是用来唯一标示打开的文件,也成为文件号。通过函数get_unused_fd_flags从根据fdtable返回一个空闲的fd,fd对应的task_struct->files[fd]空闲的。如果进程当前使用的fd个数超过了进程可以打开最大文件数的限制,则内核将返回错误,回到用户空间,否则进入第2步骤。

2. path walk

系统根据path,遍历路径。linux中一切皆文件,包括目录同样被视为文件。每个文件都有一个入口结构来标示dentry{},如果dentry记录的为目录文件,那么dentry->d_inode描述的是当前目录下的子目录的存储信息,反之,如果dentry记录的为文件,那么dentry->d_inode记录了文件相关的存储信息。linux中有个path_walk,会根据参数path中的字段和dentry->d_name进行目录的查找和遍历,path->dentry->d_inode找子目录信息,循环遍历,直到找到目标文件的dentry。目标文件的inode即为dentry->d_inode所指向的节点。

3. 构建打开文件的描述结构 file{}

当找到目标文件的i节点后,对新建的file结构进行初始化,如图蓝色箭头所示,
   file->f_path = *path;
     file->f_inode = path->dentry->d_inode;
     file->f_mapping = path->dentry->d_inode->i_mapping;
     file->f_mode = mode;
     file->f_op = fop;
     ...

4. 构建fd和file的关系

将file地址记录于task_struct->files->fd_array[fd] = &file

总结

进程打开一个文件后,内核为其构建了file{}结构,用于描述文件的读写mode、flag、当前读写位置f_pos以及文件操作的接口f_op等。而进程是通过task_struct->files->fd_array[]纪录所有打开的文件,每个打开的文件通过数组的下标进行唯一标示,这个下标即为我们open函数的返回值fd(int类型)

Linux-2.6 open()打开文件涉及的内核处理和数据结构分析相关推荐

  1. linux vim m,关于linux中使用vim打开文件出现^M的解决方法

    在linux下,不可避免的会用VIM打开一些windows下编辑过的文本文件.我们会发现文件的每行结尾都会有一个^M符号,这是因为 DOS下的编辑器和Linux编辑器对文件行末的回车符处理不一致, 各 ...

  2. Linux:如何获取打开文件和文件描述符数量

    一.linux的文件描述符 文件描述符(FD:file descriptors),也可以说是文件句柄,当某个程序打开文件时,内核返回相应的文件描述符,程序为了处理该文件必须引用此描述符.文件描述符是一 ...

  3. Linux下用vi 打开文件出现乱码

    环境 RedHat Linux 9 + VWWare 8.0 + SSH 3.2.9 + Putty 0.62 + MySQL 3.2 问题 Linux下用vi 打开文件出现乱码 解决 强烈推荐参考此 ...

  4. Linux centos 下 eclipse 打开文件时关闭

    Linux centos 下 eclipse 打开文件时关闭 现象描述:在 centos 系统下,打开eclipse后,打开文件时,eclipse退出. 在命令行下启动时,会打印异常信息: java: ...

  5. linux 已打开文件图标管理,Linux_没有启动图标利用Linux命令在终端打开文件,  在Linux系统中,打开一个 - phpStudy...

    没有启动图标利用Linux命令在终端打开文件 在Linux系统中,打开一个文件很简单,只要有启动图标就可以了,但是如果没有启动图标的话要如何在终端下打开文件呢?使用命令就能很好的解决这个问题,下面小编 ...

  6. Excel(WPS)使用VBA,不打开文件情况下提取其他工作簿数据

    Excel(WPS)使用VBA,不打开文件情况下提取其他工作簿数据 提取函数,返回提取到的值 使用示例 在不打开工作簿的情况下,VBA读取其他工作簿数据 很多方法需要打开才能提取,如果没打开会显示错误 ...

  7. Linux三种修改打开文件数量限制的方法

    系统环境 Centos7 为什么要限制打开文件的数量? 因为操作系统需要内存来管理每个文件,所以可以打开的文件数可能会受到限制.由于程序也可以关闭文件处理程序,它可以创建任意大小的文件,直到所有可用磁 ...

  8. linux下通过终端打开文件夹

    1.应用场景 在linux下进行开发时,经常需要切换目录拷贝文件.通过终端命令可以快速的切换文件夹,通过文件夹可以用鼠标方便对文件进行操作.有没有什么办法,将终端操作与文件夹操作一起使用呢? 2.方法 ...

  9. linux vim用utf8打开文件,用vim打开后中文乱码怎么办

    一般来说只需要正确设置vim的编码识别序列就很少会遇到乱码问题: set fileencodings=ucs-bom,utf-8,utf-16,gbk,big5,gb18030,latin1 这个设置 ...

  10. 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( 初始化压缩对象 | 打开文件 | 设置压缩参数 | 写入压缩图像数据 | 完成压缩 | 释放资源 )

    文章目录 一.使用 libjpeg-turbo 压缩图片流程 二.初始化 JPEG 压缩对象 三.打开文件 四.设置压缩参数 五.开始压缩 六.循环写入压缩数据 七.完成图片压缩及收尾 八.libjp ...

最新文章

  1. nginx压力测试和并发预估
  2. VIT自适应语音转文本可预测长度和内容(ocr也可)
  3. spring cloud config配置中心源码分析之注解@EnableConfigServer
  4. [云炬创业基础笔记]第二章创业者测试22
  5. 程序员面试系列——大小端
  6. Linux下的第一个驱动程序
  7. Javascript之RegExp
  8. php7 获取数据流,stream_socket_accept()
  9. java 静态代码块_JAVA静态代码块
  10. 使用Box2D制作AS3游戏——2.1a版本——Hello World Box2D .
  11. 程序员必知的Python陷阱与缺陷列表
  12. paip.yxshopV4.7.1的安装不能用的问题
  13. matlab力学实验,MATLAB在中学物理实验教学的应用
  14. 大数据集群资源监控Zabbix
  15. 163邮箱给gmail邮箱发邮件,gmail邮箱收不到
  16. 详解win10系统还原点怎么设置
  17. 独立键盘检测 proteus仿真小实验
  18. .net mvc ef 视图未定义主键问题
  19. VirtualBox 安装虚拟机步骤
  20. mysql数据库select语句用法_mysql数据库select查询语句简单用法

热门文章

  1. 论文阅读:Enhanced Pix2pix Dehazing Network
  2. Film Stocks for Mac(PS胶片模拟调色插件)
  3. JAVA试练塔之试炼技能图
  4. Centos 7硬盘扩容
  5. 周杰伦专辑《最伟大的作品》在哪看?当贝盒子畅享周董最新MV
  6. 禁止QQ2010(2009)弹迷你首页的方法
  7. Ubuntu下pycharm设定任务栏图标后打开出现问号图标
  8. uniapp 复制 粘贴功能
  9. Tea Data Analysis System 茶饮数据分析系统
  10. python中%s是什么意思_python的%s是什么意思