当前位置: 首页 > news >正文

Linux-0.11 文件系统read_write.c详解

Linux-0.11 文件系统read_write.c详解

模块简介

该模块实现了文件系统通用的读写的方法read/write/lseek。

根据文件类型的不同,在内部将调用不同的方法。如果是管道文件,则调用pipe.c中的读写方法,如果是字符设备,则会调用char_dev.c中的方法,如果是目录或者普通文件,将调用file_dev.c中的读写方法,如果是块设备文件,将调用block_dev.c中的读写方法。

函数详解

sys_read

int sys_read(unsigned int fd,char * buf,int count)

该函数是read函数的系统调用函数, 主要作用是实现各种类型的读的方法。

其实现原理是通过fd找到对应的inode节点, 然后根据inode节点的属性去调用对应的read方法, 包括read_pipe,rw_char,block_read,file_read。

这里首先对参数进行校验。如果fd大于进程对于fd的限制值NR_OPEN(20), 会返回错误。除此以外, 如果需要读取的字符数量小于0或者fd对应的文件指针为空, 也都会返回错误。

如果count数量为0, 则直接返回0。

struct file * file;
struct m_inode * inode;if (fd>=NR_OPEN || count<0 || !(file=current->filp[fd]))return -EINVAL;
if (!count)return 0;

接下来就是通过if语句判断inode的属性去调用对应的read方法, 如果是管道文件, 就调用read_pipe,如果是字符型文件,就调用rw_char进行读取, 如果是块设备文件,就调用block_read, 如果是目录文件或者常规文件, 就调用file_read。

inode = file->f_inode;
if (inode->i_pipe)return (file->f_mode&1)?read_pipe(inode,buf,count):-EIO;
if (S_ISCHR(inode->i_mode))return rw_char(READ,inode->i_zone[0],buf,count,&file->f_pos);
if (S_ISBLK(inode->i_mode))return block_read(inode->i_zone[0],&file->f_pos,buf,count);
if (S_ISDIR(inode->i_mode) || S_ISREG(inode->i_mode)) {if (count+file->f_pos > inode->i_size)count = inode->i_size - file->f_pos;if (count<=0)return 0;return file_read(inode,file,buf,count);

sys_write

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

该函数的作用与sys_read是有相似之处的,其实现原理是通过fd找到对应的inode节点, 然后根据inode节点的属性去调用对应的write方法, 包括write_pipe,rw_char,block_write,file_write。

接下来就是通过if语句判断inode的属性去调用对应的write方法, 如果是管道文件, 就调用write_pipe,如果是字符型文件,就调用rw_char进行读取, 如果是块设备文件,就调用block_write, 如果是目录文件或者常规文件, 就调用file_write。

if (inode->i_pipe)return (file->f_mode&2)?write_pipe(inode,buf,count):-EIO;
if (S_ISCHR(inode->i_mode))return rw_char(WRITE,inode->i_zone[0],buf,count,&file->f_pos);
if (S_ISBLK(inode->i_mode))return block_write(inode->i_zone[0],&file->f_pos,buf,count);
if (S_ISREG(inode->i_mode))return file_write(inode,file,buf,count);

sys_lseek

int sys_lseek(unsigned int fd,off_t offset, int origin)

该函数是重定位文件读写指针的系统调用。

	struct file * file;int tmp;if (fd >= NR_OPEN || !(file=current->filp[fd]) || !(file->f_inode)|| !IS_SEEKABLE(MAJOR(file->f_inode->i_dev)))//首先判断参数的有效性return -EBADF;if (file->f_inode->i_pipe)//管道节点头尾指针不能随意移动return -ESPIPE;switch (origin) {case 0://SEEK_SET  绝对值if (offset<0) return -EINVAL;file->f_pos=offset;break;case 1://SEEK_CUR  相对于当前偏移值if (file->f_pos+offset<0) return -EINVAL;file->f_pos += offset;break;case 2://SEEK_ENDif ((tmp=file->f_inode->i_size+offset) < 0)return -EINVAL;file->f_pos = tmp;break;default:return -EINVAL;}return file->f_pos;
}

相关文章:

Linux-0.11 文件系统read_write.c详解

Linux-0.11 文件系统read_write.c详解 模块简介 该模块实现了文件系统通用的读写的方法read/write/lseek。 根据文件类型的不同&#xff0c;在内部将调用不同的方法。如果是管道文件&#xff0c;则调用pipe.c中的读写方法&#xff0c;如果是字符设备&#xff0c;则会调用cha…...

什么是用户态和内核态?用户态切换内核态会有什么影响?

一、什么是用户态和内核态&#xff1f; 简单来讲&#xff0c;像使用java开发时&#xff0c;调用java中封装的普通方法程序时属于用户态&#xff0c;而操作内存或者cpu比如 new Thread()创建一个线程&#xff0c;Class.forName(xxx.class)这种属于内核态 用户态和内核态是操作系…...

探索iOS之CoreImage框架

CoreImage提供图像处理、人脸识别、图像增强、图像滤镜、图像转场。它操作的数据来自Core Graphics、Core Video、Image IO&#xff0c;使用CPU或GPU进行渲染。CoreImage对底层实现进行封装&#xff0c;为上层提供简单易用的API。 一、CoreImage框架 CoreImage框架分为&#…...

qml 使用Shape 画图形

最近在做项目的时候想这实现一个能够根据相对位置动态改变大小的进度条提示框&#xff0c;偶尔发现了一个很有用的组件Shape这个控件里面可以画各种线条,实线虚线矩形三角形圆角的三角形或者各种自定义形状。下面提供一个2条虚线加上一个矩形的小栗子。更多的自定义形状还是请自…...

MySQL数据库修改root账户密码

博主今天登录数据库遇到了一个问题&#xff0c;通过这篇文章&#xff08;http://t.csdn.cn/58ECT&#xff09;解决了。文中关于修改root账户密码的部分&#xff0c;博主觉得有必要写一篇文章总结下。 第一步&#xff1a;用管理员账户打开CMD 第二步&#xff1a;开启mysql服务 …...

基于springboot+Vue+ Element-Plus+mysql实现学生宿舍管理系统

基于springbootVue Element-Plusmysql实现学生宿舍管理系统 一、系统介绍二、功能展示1.登陆2、主页--学生3、主页--宿舍管理员4.学生管理--管理员5.宿管信息--管理员6.宿舍管理--管理员7.信息管理--管理员8.申请管理--管理员9.访客管理--管理员10.水电费管理--管理员11.卫生管…...

中国人才选拔制度演变

1、世官制 是西周时人们仍保持着牢固的宗族血缘联系&#xff0c;人群基本以族区分&#xff0c;并得到宗法封建制的制度上的保证&#xff0c;从而自然形成了各级宗族长同时也就是各级官长&#xff0c;家国一体、家国同构的统治模式、格局。换句话来讲就是我们所说的世袭制。 其…...

【JavaSE】Java基础语法(十六):抽象类

文章目录 1. 抽象类的概述2. 抽象类的特点3. 抽象类的实用价值4. 抽象类的案例 1. 抽象类的概述 当我们在做子类共性功能抽取时&#xff0c;有些方法在父类中并没有具体的体现&#xff0c;这个时候就需要抽象类了&#xff01; 在Java中&#xff0c;一个没有方法体的方法应该定义…...

【Kafka】超详细介绍

文章目录 概念部署方案磁盘网络CPUpartition的数量 命令查看版本找kafka和zookeeper的ip/porttopic创建 topic查看get topic 列表get topic 详情 修改topic修改分区级别参数(如增加partition) 删除topic设置消息大小上限 生产查看生产生产消息 查看消费server 查看 offset查看积…...

2023 华为 Datacom-HCIE 真题题库 07/12--含解析

多项选择题 1.[试题编号&#xff1a;190187] &#xff08;多选题&#xff09;如图所示的拓扑采用了VXLAN分布式网关&#xff0c;SW1上的VBDIF10配置了&#xff1a;arp-proxy local enable命令&#xff0c;则以下描述中正确的有哪些项&#xff1f; A、SW1收到PC1发往PC2的报文&…...

Spring的作用域和生命周期

目录 1.Bean的作用域 2.Bean的作用域的分类 3.设置作用域 4.Spring的执行流程&#xff08;生命周期&#xff09; 5.Bean的生命周期 1.Bean的作用域 lombok &#xff08;dependency依赖&#xff09; 是为了解决代码的冗余&#xff08;比如说get和set方法&#xff09;那些构造…...

岭回归有看点:正则化参数解密,显著性不再成问题!

一、概述 「L2正则化&#xff08;也称为岭回归&#xff09;」 是一种用于线性回归模型的正则化方法&#xff0c;它通过在模型的损失函数中添加一个惩罚项来防止过拟合。L2正则化的惩罚项是模型参数的平方和&#xff0c;乘以一个正则化参数λ&#xff0c;即&#xff1a; L2正则化…...

Android 12.0修改recovery 菜单项字体大小

1.概述 在Android 12.0进入recovery模式后,界面会g_menu_actions 菜单选项和 提示文字,而这些文字的大小不像上层一样是通过设置属性来表示大小的 而它确是通过字体png图片的大小来计算文字的宽和高的,然后可以修改字体大小 2. 修改recovery 菜单项字体大小的核心类 buil…...

【计算机网络】 7、websocket 概念、sdk、实现

文章目录 一、背景二、简介三、client3.1 ws 构造函数3.2 ws.readyState3.3 ws.onopen3.4 ws.onclose3.5 ws.onmessage3.6 ws.send3.7 ws.bufferedAmount3.8 ws.onerror 四、server4.1 go4.1.1 apifox client4.1.2 js client 五、范式 一、背景 已经有了 http 协议&#xff0c…...

python中的常见运算符

文章目录 算数运算符赋值运算关系运算符逻辑运算符非布尔值的与或非运算条件运算符(也叫三元运算符)运算符的优先级 算数运算符 加法运算符&#xff08;如果两个字符串之间进行加法运算&#xff0c;则会进行拼串操作&#xff09; - 减法运算符 * 乘法运算符&#xff08;如果将字…...

TypeScript类型

TypeScript 是什么&#xff1f; 是以avaScript为基础构建的语言个一JavaScript的超集。可以在任何支持JavaScript的平台中执行。TypeScript扩展了JavaScript,并添加了类型。TS不能被JS解析器直接执行&#xff0c;需要编译成js。 基本类型 声明完变量直赴进行赋值 let c: boo…...

Integer源码

介绍 Integer是int类型的包装类&#xff0c;继承自Number抽象类&#xff0c;实现了Comparable接口。提供了一些处理int类型的方法&#xff0c;比如int到String类型的转换方法或String类型到int类型的转换方法&#xff0c;当然也包含与其他类型之间的转换方法。 Comparable提供…...

【四】设计模式~~~创建型模式~~~建造者模式(Java)

【学习难度&#xff1a;★★★★☆&#xff0c;使用频率&#xff1a;★★☆☆☆】 4.1. 模式动机 无论是在现实世界中还是在软件系统中&#xff0c;都存在一些复杂的对象&#xff0c;它们拥有多个组成部分&#xff0c;如汽车&#xff0c;它包括车轮、方向盘、发送机等各种部件…...

MarkDown的基本使用方法

为了给官方的文档知识总结&#xff1a;Markdown 基本语法 | Markdown 官方教程 #空格内容&#xff1a;‘#’表示标题的等级&#xff0c;越少表示标题级别越高&#xff08;字越大&#xff09; 在一行的末尾加两个或多个空格再回车&#xff0c;就是我们普通的文本回车。【还有一…...

IDEA 安装配置步骤详解

引言 IntelliJ IDEA 是一款功能强大的集成开发环境&#xff0c;它具有许多优势&#xff0c;适用于各种开发过程。本文将介绍 IDEA 的主要优势&#xff0c;并提供详细的安装配置步骤。 介绍 IntelliJ IDEA&#xff08;以下简称 IDEA&#xff09;之所以被广泛使用&#xff0c;…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...

动态规划-1035.不相交的线-力扣(LeetCode)

一、题目解析 光看题目要求和例图&#xff0c;感觉这题好麻烦&#xff0c;直线不能相交啊&#xff0c;每个数字只属于一条连线啊等等&#xff0c;但我们结合题目所给的信息和例图的内容&#xff0c;这不就是最长公共子序列吗&#xff1f;&#xff0c;我们把最长公共子序列连线起…...

云原生时代的系统设计:架构转型的战略支点

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、云原生的崛起&#xff1a;技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深&#xff0c;传统的 I…...