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

7.2.1.主要函数调用关系图

sys_write (参见7.2.2 )

| ------------- vfs_write (参见7.2.3)

7.2.2.主调用函数sys_write

asmlinkage ssize_t sys_write(unsigned int fd, const char __user * buf, size_t count)

{

        struct file *file;

        ssize_t ret = -EBADF;

        int fput_needed;

// 从进程文件链表中根据fd获取file文件表,如果没有这个文件表,则返回EBADF错误

        file = fget_light(fd, &fput_needed); // fput_needed标识是否需要更新file结构的count

        if (file) {

                loff_t pos = file_pos_read(file); // 获取file结构的pos位移参数

                ret = vfs_write(file, buf, count, &pos); // 写入文件,参见7.2.3 描述

                file_pos_write(file, pos); // 更新file结构的pos位移参数

                fput_light(file, fput_needed); // 更新文件count标识

        }

        return ret;

                        }

7.2.3.sys_write子函数vfs_write

vfs_write将调用文件驱动模块的write函数向磁盘中写入数据并返回。如果在打开该文件时,指定了O_APPEND选择项,则在每次写操作之前,将文件位移量设置在文件的当前结尾处再继续写入。

ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)

{

        ssize_t ret;

        if (!(file->;f_mode & FMODE_WRITE))

                return -EBADF; // 如果文件不允许写模式,则返回EBADF错误

        if (!file->;f_op || (!file->;f_op->;write && !file->;f_op->;aio_write))

                return -EINVAL; // 如果文件结构没有read函数指针,则返回EINVAL错误

        if (unlikely(!access_ok(VERIFY_READ, buf, count)))

                return -EFAULT; // 检查传入的参数是否超出了用户空间地址,如果是则返回EFAULT错误

        // 通过inode结构lock当前要操作的区域,成功返回0

        ret = rw_verify_area(WRITE, file, pos, count);

        if (!ret) {

                // 检查进程对文件是否有WRITE操作权限,成功,则返回0

                ret = security_file_permission (file, MAY_WRITE);

                if (!ret) {

                        if (file->;f_op->;write) // 调用文件驱动模块write函数写入数据

                                ret = file->;f_op->;write(file, buf, count, pos);

                        else // 否则调用直接磁盘写操作

                                ret = do_sync_write(file, buf, count, pos);

                        if (ret >; 0) {

                                // 通知目录,当前文件已经被改写

                                dnotify_parent(file->;f_dentry, DN_MODIFY);

                                current->;wchar += ret; // 刷新进程写数据计数器

                        }

                        current->;syscw++;

                }

        }

        return ret;

                        }
 

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

上一页  [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 传世私服 传奇世界私服