免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2470 | 回复: 8
打印 上一主题 下一主题

[文件系统] 关于open函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-02-22 13:08 |只看该作者 |倒序浏览
本帖最后由 mxgsgtc 于 2017-02-22 13:12 编辑

大家都知道,比如打开一个文件 "/etc/1.txt",需要调用open函数
最近跟了一下open函数的源码,最后会调用__dentry_open()这个函数
__dentry_open()这个函数中
static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt,
                                        struct file *f,
                                        int (*open)(struct inode *, struct file *),
                                        const struct cred *cred)
{
     ......................
        struct inode *inode;
        inode = dentry->d_inode; //dentry对应的是"/etc"目录吧,这句话是获取"/etc"目录对应的inode
   .....................
        f->f_op = fops_get(inode->i_fop);
  .......................

        if (!open && f->f_op)
                open = f->f_op->open;////将"/etc"目录inode对应的i_fop赋值给open
...............................
}
问题: 不应该是1.txt文件对应的inode->f_op赋值给open吗?,但是这个函数貌似没有关于1.txt文件inode的获取操作确是把/etc/这个目录的f_open->open赋值给了open参数,不太明白,求助大家了!









论坛徽章:
0
2 [报告]
发表于 2017-02-22 14:57 |只看该作者
__dentry_open  打开的就是对应的1.txt 的 不用怀疑
。。解析路径命为dentry 在其他函数里面做了。

论坛徽章:
0
3 [报告]
发表于 2017-02-22 15:10 |只看该作者
set_nameidata(&nd, dfd, pathname);

这个函数就是解析填充的

论坛徽章:
0
4 [报告]
发表于 2017-02-22 15:37 |只看该作者
回复 3# nuclearxin

多谢回复,我想请教下, entry不是对应目录结构吗?

论坛徽章:
0
5 [报告]
发表于 2017-02-22 16:03 |只看该作者
回复 3# nuclearxin

不好意思,有个地方没弄明白, 比如对于 "/etc/1.txt" 来说etc      所对应的 dentry 应该是"/", dentry->d_inode对应的是 根目录"/"的inode
1.txt   所对应的 dentry 应该是"etc", dentry->d_inode对应的是 根目录"etc"的inode

----------------------
也就是说,我的理解中 ,dentry应该只是代表目录结构
dentry->d_inode只目录对应的inode

论坛徽章:
0
6 [报告]
发表于 2017-02-22 16:18 |只看该作者
回复 4# mxgsgtc

dentry 是 可以理解为node一个path就是 dentry - dentry - dentry
由于linux 下 目录是树形 的 而且 directory 也是文件
所以你要解析路径就要从前向后一个一个寻找
先找“/” 这个在superblock 结构里面  struct dentry   *s_root;

目录在文件系统上是个“文件” , 里面包含 / 这个dir下面所有的文件
依次想下找 到你需要的为止



论坛徽章:
0
7 [报告]
发表于 2017-02-22 16:35 |只看该作者
本帖最后由 mxgsgtc 于 2017-02-22 16:43 编辑

回复 6# nuclearxin

真的很感谢回复! 我好想明白了,那是不是我可以这么理解
"/etc/1.txt"

etc所对应的dentry--->"/etc" (路径)
这个"路径"的inode,即dentry->d_inode 就是etc目录的inode
----------------------
同理:
1.txt所对应的dentry--->"/etc/1.txt"(路径)
这个"路径"的inode,即dentry->d_inode 就是1.txt文件的inode

论坛徽章:
0
8 [报告]
发表于 2017-02-22 16:50 |只看该作者
回复 7# mxgsgtc

/      etc/       1.txt
对应的map是

dentry=/  dentry=etc/  dentry=1.txt



你在想想 。

内核这东西。。。。。你自己能说通就好。


论坛徽章:
0
9 [报告]
发表于 2017-02-22 17:04 |只看该作者
本帖最后由 mxgsgtc 于 2017-02-22 17:06 编辑

回复 8# nuclearxin
谢谢大神! 这回应该是明白了...
路径结构关系: dentry("/")<-----(parent)--dentry("etc/")  <------(parent)---dentry("1.txt")
是这个意思吧?
也就是说,open文件时,根据dentry关系去寻找,最后找到1.txt对应的dentry
对于1.txt来说
dentry->d_inode == 1.txt的inode
是这样吧


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP