Linux-2.6 open()打开文件涉及的内核处理和数据结构分析 http://blog.csdn.net/ordeder/article/details/24420637
来源:互联网 发布:织梦cms轮播 编辑:程序博客网 时间:2024/05/18 03:32
Linux-2.6 open()打开文件涉及的内核处理和数据结构分析
分类: Linux2014-04-24 16:28 1497人阅读 评论(0) 收藏 举报
linuxopen
目录(?)[+]
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类型)版权声明:本文为博主(http://blog.csdn.net/ordeder)原创文章,未经博主允许不得转载。
0 0
- Linux-2.6 open()打开文件涉及的内核处理和数据结构分析 http://blog.csdn.net/ordeder/article/details/24420637
- Linux-2.6 open()打开文件涉及的内核处理和数据结构分析
- Linux(C/C++)下的文件操作open、fopen与freopen http://blog.csdn.net/a656343072/article/details/40539889
- linux内核mount系统调用源码分析 http://blog.csdn.net/wugj03/article/details/41958029
- [置顶] 《Linux启动过程分析》内核挂载根文件系统 http://blog.csdn.net/tankai19880619/article/details/12093239
- Linux中的文件描述符与打开文件之间的关系 :http://blog.csdn.net/cywosp/article/details/38965239
- 管道的应用(pipe)《深入分析Linux内核源码》 http://blog.csdn.net/wangpengqi/article/details/7996182
- 文件结构体struct file(Linux 2.6.23内核) (转) http://blog.csdn.net/wangchaoxjtuse/article/details/6036684
- Linux内核大讲堂 (三) 解不开的"/"情结 http://blog.csdn.net/z2007b/article/details/6575809
- 详解Linux内核红黑树算法的实现 http://blog.csdn.net/npy_lp/article/details/7420689
- CFileException文件的异常处理 http://blog.csdn.net/holandstone/article/details/7602249
- Linux--根文件系统的挂载过程分析 http://blog.csdn.net/guopeixin/article/details/5962482
- Linux 文件系统(三)---dup和fork函数执行后的文件情况 http://blog.csdn.net/shanshanpt/article/details/39049579
- suspend造成死锁的例子和原因分析 http://blog.csdn.net/magictong/article/details/4161571
- linux下C获取文件的大小http://blog.csdn.net/gdujian0119/article/details/6363574
- Linux的system()和popen()差异 http://blog.csdn.net/liuxingen/article/details/47057539
- Linux内核源代码分析——fork()原理&多进程网络模型 http://blog.csdn.net/hyfcomeon/article/details/9060237
- ubuntu如何修改默认的文件关联打开程序 转自:http://blog.csdn.net/blueboy82006/article/details/5305497
- Android 4.4+ 实现半透明状态栏(Translucent Bars)
- Environment variable ORACLE_SID not defined. Please define it.启动EM报错
- Eclipse+maven+spring
- 项目进度管理的3大技巧
- 分享一个链接
- Linux-2.6 open()打开文件涉及的内核处理和数据结构分析 http://blog.csdn.net/ordeder/article/details/24420637
- 【手势交互】11. SixSense STEM System
- 怎样卸载Mac软件呢
- 深入Java单例模式
- 昨天,今天,明天 沉溺于!
- 平凡人白日梦,云计算圆我梦!
- js中立即执行函数的介绍
- setsockopt 的用法
- Android Uri带中文乱码问题