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