岁月联盟 · 中国技术网 本站主页 | 安全认证 | 用户服务 | 技术论坛
新闻快报 | 新手学堂 | 黑客特区 | 程序语言 | 数 据 库 | 防 火 墙 | 路由交换 | 系统集成 | 服 务 器 | 存储备份 | 考试认证
Windows | Linux | Java | 协议分析 | 问题解答 | 进程大全 | 网页设计 | 多 媒 体 | 图库资料 | 软件下载 | 站内下载
  您现在的位置: 岁月联盟 >> Linux频道 >> 系统管理 >> 内核技术 >> Linux频道正文
Linux 2.6.11内核文件IO系统调用详解
作者:未知 文章来源:本站整理 点击数: 更新时间:2007-12-18 17:31:42
的操作数据。

struct nameidata {

        struct dentry        *dentry; // 目录数据

        struct vfsmount *mnt; // 虚拟文件挂载点数据

        struct qstr        last; // hash值

        unsigned int        flags; // 文件操作标识

        int                last_type; // 类型

        unsigned        depth; 

        char *saved_names[MAX_NESTED_LINKS + 1];

        union {

                struct open_intent open;

        } intent; // 专用数据

};

struct file *filp_open(const char * filename, int flags, int mode){

        int namei_flags, error;

        struct nameidata nd;

        namei_flags = flags;

        if ((namei_flags+1) & O_ACCMODE)

                namei_flags++; // 如果flags有O_WRONLY,则增加O_RDONLY

        if (namei_flags & O_TRUNC)

                namei_flags |= 2; // 如果有O_TRUNC,则增加O_RDWR

        error = open_namei(filename, namei_flags, mode, &nd); // 如3.2.3.1 描述

        if (!error)

                return dentry_open(nd.dentry, nd.mnt, flags); // 如3.2.3.2描述

        return ERR_PTR(error); // 返回错误代码

                        }

上一页  [1] [2] [3] [4] [5] [6] [7] 下一页  

 

4.2.4.1.filp_open子函数open_namei

open_namei函数主要执行文件操作的inode部分的打开等操作。

int open_namei(const char * pathname, int flag, int mode, struct nameidata *nd){

        int acc_mode, error = 0;

        struct dentry *dentry;

        struct dentry *dir;

        int count = 0;

        acc_mode = ACC_MODE(flag); // 取出低2位操作标识

        if (flag & O_APPEND) // 取出O_APPEND操作标识

                acc_mode |= MAY_APPEND;

        //赋值open函数的专用数据

        nd->;intent.open.flags = flag; 

        nd->;intent.open.create_mode = mode;

        // 如果不需要创建文件,则在进程目录文件表搜索已有文件,并把结果拷贝到nd中

        if (!(flag & O_CREAT)) {

                error = path_lookup(pathname, lookup_flags(flag)|LOOKUP_OPEN, nd);

                if (error) // 错误代码有ENOENT,ENOTDIR,EAGAIN,ESTALE,

                        return error;

                goto ok; // 否则执行打开函数,更新inode数据

        }

// 在进程文件表中搜索该文件,如果不存在,则创建,结果由nd保存

        error = path_lookup(pathname, LOOKUP_PARENT|LOOKUP_OPEN|LOOKUP_CREATE, nd);

        if (error)

                return error;

        // 检测nd的结果是否是一个目录文件,是则返回

        error = -EISDIR;

        if (nd->;last_type != LAST_NORM || nd->;last.name[nd->;last.len])

                goto exit;

        // 获取文件的相关目录数据,结果返回到dentry中。

        dir = nd->;dentry;

        nd->;flags &= ~LOOKUP_PARENT;

        down(&dir->;d_inode->;i_sem);

        dentry = __lookup_hash(&nd->;last, nd->;dentry, nd);

do_last:

        // 如果dentry是一个错误值,则返回

        error = PTR_ERR(dentry);

        if (IS_ERR(dentry)) {

                up(&dir->;d_inode->;i_sem);

                goto exit;

        }

        // 如果dentry不存在,则创建他

        if (!dentry->;d_inode) {

                if (!IS_POSIXACL(dir->;d_inode))

                   

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页


  • 上一个Linux频道:
  • 下一个Linux频道:
  •  
    热门文章
    推荐文章
    关于我们 | 发展历程 | 网站地图 | 广告服务 | 招贤纳士 | 战略合作 | 友情链接 | 著作声明 | 联系我们
    Copyright © 2002-2007 SYUE All rights reserved.
    E_mail:Admin@Syue.Com 皖ICP备05004589号
    未经授权禁止转载、摘编、复制或建立镜像.如有违反,追究法律责任.
    天龙八部私服 传世私服 传奇世界私服 传奇私服 bet365 天龙八部私服 热血江湖私服 英雄合击传奇私服 热血江湖私服 bet365 bet365