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

6.2.2.主调用函数sys_read

asmlinkage ssize_t sys_read(unsigned int fd, 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_read(file, buf, count, &pos); // 读取文件内容,参见6.2.2

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

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

        }

        return ret;

                        }

6.2.3.sys_read子函数vfs_read

vfs_read将调用文件驱动模块的read函数从磁盘中读入数据并返回。

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

{

        ssize_t ret;

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

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

        if (!file->;f_op || (!file->;f_op->;read && !file->;f_op->;aio_read))

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

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

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

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

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

        if (!ret) {

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

                ret = security_file_permission (file, MAY_READ); 

                if (!ret) {

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

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

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

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

                        if (ret >; 0) {

                                // 通知目录,当前文件已经被访问

                                dnotify_parent(file->;f_dentry, DN_ACCESS);

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

                        }

                        current->;syscr++;

                }

        }

        return ret;

                        }

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

 

7.write函数

7.1.原型与参数

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

sys_write函数将数据写入到文件中。其返回值通常与参数nbytes的值不同,-1表示出错。write出错的一个常见原因是:磁盘已写满,或者超过了对一个给定进程的文件长度限制。对于普通文件,写操作从文件的当前位移量处开始。如果在打开该文件时,指定了O_APPEND选择项,则在每次写操作之前,将文件位移量设置在文件的当前结尾处。在一次成功写之后,该文件位移量增加实际写的字节数。

7.2.实现分析

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


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