Linux-2.6 open()打开文件涉及的内核处理和数据结构分析
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()打开文件涉及的内核处理和数据结构分析相关推荐
- linux vim m,关于linux中使用vim打开文件出现^M的解决方法
在linux下,不可避免的会用VIM打开一些windows下编辑过的文本文件.我们会发现文件的每行结尾都会有一个^M符号,这是因为 DOS下的编辑器和Linux编辑器对文件行末的回车符处理不一致, 各 ...
- Linux:如何获取打开文件和文件描述符数量
一.linux的文件描述符 文件描述符(FD:file descriptors),也可以说是文件句柄,当某个程序打开文件时,内核返回相应的文件描述符,程序为了处理该文件必须引用此描述符.文件描述符是一 ...
- Linux下用vi 打开文件出现乱码
环境 RedHat Linux 9 + VWWare 8.0 + SSH 3.2.9 + Putty 0.62 + MySQL 3.2 问题 Linux下用vi 打开文件出现乱码 解决 强烈推荐参考此 ...
- Linux centos 下 eclipse 打开文件时关闭
Linux centos 下 eclipse 打开文件时关闭 现象描述:在 centos 系统下,打开eclipse后,打开文件时,eclipse退出. 在命令行下启动时,会打印异常信息: java: ...
- linux 已打开文件图标管理,Linux_没有启动图标利用Linux命令在终端打开文件, 在Linux系统中,打开一个 - phpStudy...
没有启动图标利用Linux命令在终端打开文件 在Linux系统中,打开一个文件很简单,只要有启动图标就可以了,但是如果没有启动图标的话要如何在终端下打开文件呢?使用命令就能很好的解决这个问题,下面小编 ...
- Excel(WPS)使用VBA,不打开文件情况下提取其他工作簿数据
Excel(WPS)使用VBA,不打开文件情况下提取其他工作簿数据 提取函数,返回提取到的值 使用示例 在不打开工作簿的情况下,VBA读取其他工作簿数据 很多方法需要打开才能提取,如果没打开会显示错误 ...
- Linux三种修改打开文件数量限制的方法
系统环境 Centos7 为什么要限制打开文件的数量? 因为操作系统需要内存来管理每个文件,所以可以打开的文件数可能会受到限制.由于程序也可以关闭文件处理程序,它可以创建任意大小的文件,直到所有可用磁 ...
- linux下通过终端打开文件夹
1.应用场景 在linux下进行开发时,经常需要切换目录拷贝文件.通过终端命令可以快速的切换文件夹,通过文件夹可以用鼠标方便对文件进行操作.有没有什么办法,将终端操作与文件夹操作一起使用呢? 2.方法 ...
- linux vim用utf8打开文件,用vim打开后中文乱码怎么办
一般来说只需要正确设置vim的编码识别序列就很少会遇到乱码问题: set fileencodings=ucs-bom,utf-8,utf-16,gbk,big5,gb18030,latin1 这个设置 ...
- 【Android 内存优化】Android 工程中使用 libjpeg-turbo 压缩图片 ( 初始化压缩对象 | 打开文件 | 设置压缩参数 | 写入压缩图像数据 | 完成压缩 | 释放资源 )
文章目录 一.使用 libjpeg-turbo 压缩图片流程 二.初始化 JPEG 压缩对象 三.打开文件 四.设置压缩参数 五.开始压缩 六.循环写入压缩数据 七.完成图片压缩及收尾 八.libjp ...
最新文章
- Leetcode 373. 查找和最小的K对数字 解题思路及C++实现
- 上海 |《PMCAFF产品经理第一课》报名倒计时手慢无,微博副总裁、丁香园、1号店、淘宝产品总监私房干货分享...
- 波形捕捉:(2)创建捕捉设备对象
- JavaScript——易班优课YOOC课群在线测试自动答题解决方案(八)功能面板
- hadoop伪分布式(单机版)安装,Linux
- 互联网晚报 | 12月31日 星期五 | 滴滴发布上市后首份财报;商汤科技正式登陆港交所;我国高铁运营里程突破4万公里...
- 单例模式 java 实现_单例模式
- OpenGL(二)三维变换
- 前端的ajax缓存,解析jquery中的ajax缓存问题
- nginx利用try_files实现多个源
- Request.GetOwinContext()打不到
- Spring的p标签
- linux 五笔输入法下载软件,极点五笔Linux版|极点五笔输入法官方linux版_最火软件站...
- 你可能需要的各个行业年度总结 ppt 模板
- 重磅!腾讯优图11篇论文入选AI顶会AAAI 2021
- 桌面计算机右键管理没反应,右键计算机(我的电脑)管理选项打不开解决措施
- 3D打印机将用于太空食物 未来或可打印披萨
- python语言常用的中文分词第三方库是_基于boost使用Python调用NLPIR(ICTCLAS2013)中文分词组件...
- 【Matlab】Matlab将mat文件保存为txt文件
- java 时间格式检查