在文件成功打开之后,进程将使用内核提供的read和write系统调用,来读取或修改文件的数据。内核中文件读写操作的系统调用实现基本都一样,下面我们看看文件的读取。

[cpp] view plain copy  print?
  1. /*sys_read()*/
  2. SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
  3. {
  4. struct file *file;
  5. ssize_t ret = -EBADF;
  6. int fput_needed;
  7. /*从fd中获取相应文件对象地址*/
  8. file = fget_light(fd, &fput_needed);
  9. if (file) {
  10. /*获取文件访问指针*/
  11. loff_t pos = file_pos_read(file);</pre><pre name="code" class="cpp"><span style="white-space:pre">      </span>/*实现*/
  12. ret = vfs_read(file, buf, count, &pos);
  13. /*位置指针移动*/
  14. file_pos_write(file, pos);
  15. /*释放文件对象*/
  16. fput_light(file, fput_needed);
  17. }
  18. /*返回读取的字节数*/
  19. return ret;
  20. }
  21. 读取实现,返回读取字节数
  22. ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
  23. {
  24. ssize_t ret;
  25. /*如果标志中不允许所请求的访问,则返回*/
  26. if (!(file->f_mode & FMODE_READ))
  27. return -EBADF;
  28. /*如果没有相关的操作,则返回*/
  29. if (!file->f_op || (!file->f_op->read && !file->f_op->aio_read))
  30. return -EINVAL;
  31. /*检查参数*/
  32. if (unlikely(!access_ok(VERIFY_WRITE, buf, count)))
  33. return -EFAULT;
  34. /*对要访问的文件部分检查是否有冲突的强制锁*/
  35. ret = rw_verify_area(READ, file, pos, count);
  36. if (ret >= 0) {
  37. count = ret;
  38. /*下面的方法返回实际传送的字节数,文件指针被适当的修改*/
  39. if (file->f_op->read)/*如果定义,则用他来传送数据*/
  40. ret = file->f_op->read(file, buf, count, pos);
  41. else
  42. /*通用读取例程*/
  43. ret = do_sync_read(file, buf, count, pos);
  44. if (ret > 0) {
  45. fsnotify_access(file->f_path.dentry);
  46. add_rchar(current, ret);
  47. }
  48. inc_syscr(current);
  49. }
  50. /*返回实际传送字节数*/
  51. return ret;
  52. }

Linux虚拟文件系统之文件读取(sys_read())相关推荐

  1. 网络与IO知识扫盲(一):Linux虚拟文件系统,文件描述符,IO重定向

    系统IO原理 在 Linux 中: VFS(Virtual Filesystem Switch):虚拟文件系统,是一个目录树.树上不同的节点可以映射到物理的文件地址,可以挂载. 相当于一个解耦层,在具 ...

  2. Linux虚拟文件系统、文件描述符、管道

    在Linux中,所有内容都是以文件的形式保存和管理的,即一切皆文件,普通文件是文件,目录(Windows下称为文件夹)是文件,硬件设备(键盘.监视器.硬盘.打印机等)都是文件,就连套接字(socket ...

  3. linux 目录防篡改,一种基于Linux虚拟文件系统的防篡改方法及系统的制作方法

    一种基于Linux虚拟文件系统的防篡改方法及系统的制作方法 [技术领域] [0001]本发明涉及文件防护技术领域,特别涉及一种基于Linux虚拟文件系统的防篡改方法及系统. [背景技术] [0002] ...

  4. Linux虚拟文件系统:数据结构与文件系统注册、文件打开读写

    数据结构 超级块 - super_block 索引节点 - inode 目录项 - dentry 文件结构 - file 虚拟文件系统实现 注册文件系统 - register_filesystem 打 ...

  5. Linux虚拟文件系统

    从文件 I/O 看 Linux 的虚拟文件系统 1 引言 Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等.通过使用同一套文件 I/O 系统 调用即可对 Linux ...

  6. Linux 虚拟文件系统四大对象:超级块、inode、dentry、file之间关系

    一:文件系统 1. 什么是文件系统? 操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统. 通常文件系统是用于存储和组织文件的一种机制,便于对文件进行方便的查找与访问. 文件系统 ...

  7. linux虚拟文件系统浅析

    linux虚拟文件系统浅析 虚拟文件系统(VFS) 在我看来, "虚拟"二字主要有两层含义: 1, 在同一个目录结构中, 可以挂载着若干种不同的文件系统. VFS隐藏了它们的实现细 ...

  8. Linux 虚拟文件系统(一)概述

    Linux 虚拟文件系统(一)概述 tags: Linux源码 Linux 虚拟文件系统一概述 文章梗概 正文 文件系统 虚拟文件系统架构 虚拟文件系统如何知道可用的文件系统有哪些的 不太喜欢的环节 ...

  9. linux 文件系统 vfs,linux虚拟文件系统vfs

    <操作系统>课程设计报告课程设计题目:操作系统课程设计 设计时间:2016/1/10一. 课程设计目的与要求需要完成的内容:(1) 安装虚拟机:Vmware.Vmware palyer ( ...

  10. linux 创建 虚拟文件系统设备 文件节点 使用 proc_create 实例 简介

    proc虚拟文件系统也可以创建虚拟文件节点,实现用户空间与内核空间的交互.在驱动中创建节点,可以实现对硬件的控制.proc_create函数原型(在kernel-3.10/include/linux/ ...

最新文章

  1. 为什么优秀的程序员都成了无能的领导?
  2. linux 进程 地址空间 内存分布 简介
  3. Python教程:os 与 sys 模块详细用法
  4. java+testng接口测试入门
  5. SFTP多用户权限 linux环境 一站式解决方案
  6. python安装不上怎么办_python依赖安装失败怎么办
  7. 单例模式应用场景_面试:请你谈谈单例模式的优缺点,注意事项,使用场景
  8. ROS——RPLIDAR A1 SDK详解
  9. 实验02 使用网络模拟器Packet Tracer
  10. 2020快手上市招股书
  11. python之shapely库的使用
  12. 行业权威来揭秘,商用PC为什么首选12代酷睿
  13. 无代码开发大众化,摆脱Excel轻松管理企业数据
  14. entity framework core mysql,DotNet Core下使用 EntityFrameworkCore 操作MySQL (一)
  15. 已解决TypeError: Descriptors cannot not be created directly.
  16. 数据库设计学习①:数据库设计简介
  17. 【古琴】初学者选择练习琴的六条准则
  18. 基础工业工程一些知识点 易树平第二版
  19. Web3时代加密元宇宙才是唯一可行的道路
  20. WARNING: Unknown module: java.rmi specified to --add-opens如何解决

热门文章

  1. ORCALE常用查询语句
  2. python url拼接_简单一文教你如何用python爬虫爬取扇贝单词
  3. 四种插入数据的MySQL语句比较
  4. Xcode8报错:No code signature found
  5. 内存溢出真实案例分析
  6. H5 data-* 属性,设置获取方法总结
  7. 为何time_before 起作用【转】
  8. 少量数据通过Excel表格数据导入server SqlServer查询
  9. 特殊情形的Riemann引理
  10. postman传各种类型的数组格式