首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>linux 内核>文章内容
Linux 2.6.11内核文件IO系统调用详解
来源:www.unix5.com 作者:riechelr_hl 发布时间:2007-05-20  

 

7.write函数

 

7.1.原型与参数

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

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

 

7.2.实现分析

 

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;
}


 


共6页: 上一页 [1] [2] [3] [4] [5] 6 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·使用 Linux 系统调用的内核命令
·Linux操作系统的源代码目录树结
·Linux用户态与内核态的交互讲解
·Linux内核对I/O端口的管理实现(
·深入分析 Linux操作系统的内核链
·Linux内核可装载模块对设备驱动
·概述Linux系统的驱动框架及驱动
·详解Linux 2.6内核新文件系统变
·Linux系统可卸载内核模块完全指
·FreeBSD手册讲解(一)--配置FreeB
·编译Linux操作系统的内核讲解
·Linux系统可卸载内核模块完全指
  相关文章
·定制Linux内核 充分发挥系统的潜
·Linux内核模块和驱动程序的详细
·剖析Linux 2.6内核在嵌入式上的
·Linux操作系统内核启动参数详细
·详细解析Linux操作系统的内核空
·Linux内核可装载模块对设备驱动
·走向Linux系统高手之路 编译内核
·深入分析 Linux操作系统的内核链
·Linux内核入侵检测安全增强实现
·Linux内核入侵检测安全增强实现
·Linux操作系统的源代码目录树结
·使用 Linux 系统调用的内核命令

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!