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. Leetcode 373. 查找和最小的K对数字 解题思路及C++实现
  2. 上海 |《PMCAFF产品经理第一课》报名倒计时手慢无,微博副总裁、丁香园、1号店、淘宝产品总监私房干货分享...
  3. 波形捕捉:(2)创建捕捉设备对象
  4. JavaScript——易班优课YOOC课群在线测试自动答题解决方案(八)功能面板
  5. hadoop伪分布式(单机版)安装,Linux
  6. 互联网晚报 | 12月31日 星期五 | 滴滴发布上市后首份财报;商汤科技正式登陆港交所;我国高铁运营里程突破4万公里...
  7. 单例模式 java 实现_单例模式
  8. OpenGL(二)三维变换
  9. 前端的ajax缓存,解析jquery中的ajax缓存问题
  10. nginx利用try_files实现多个源
  11. Request.GetOwinContext()打不到
  12. Spring的p标签
  13. linux 五笔输入法下载软件,极点五笔Linux版|极点五笔输入法官方linux版_最火软件站...
  14. 你可能需要的各个行业年度总结 ppt 模板
  15. 重磅!腾讯优图11篇论文入选AI顶会AAAI 2021
  16. 桌面计算机右键管理没反应,右键计算机(我的电脑)管理选项打不开解决措施
  17. 3D打印机将用于太空食物 未来或可打印披萨
  18. python语言常用的中文分词第三方库是_基于boost使用Python调用NLPIR(ICTCLAS2013)中文分词组件...
  19. 【Matlab】Matlab将mat文件保存为txt文件
  20. java 时间格式检查

热门文章

  1. 每日一字:biáng
  2. 融云亮相GTC全球流量大会 荣膺鲸鸣奖2019年度优秀出海服务商
  3. 同一方法被多个Aspect拦截, 修改切面@Around @Before的执行顺序
  4. 程序员应该掌握的英语词汇
  5. 免费混合虚拟化OVM数据中心解决方案
  6. 贴吧老矣,尚能饭否?
  7. 服务器的mib文件,snmp 服务器增加 mib
  8. 解决SVN造成的桌面图标问号
  9. 【研一周小结】第十周个人学习总结
  10. 大学计算机技术导论,北京邮电大学计算机学院网络技术导论第一章资料.ppt