Linux系统调用read、write

0 前言

    《Linux系统调用》整体介绍了系统调用,本文重点分析其中read、write的实现与使用方法。

1 定义

1.1 read

SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
{
    struct file *file;
    ssize_t ret = -EBADF;
    int fput_needed;
    
    file = fget_light(fd, &fput_needed);
    if (file) {
        loff_t pos = file_pos_read(file);
        ret = vfs_read(file, buf, count, &pos);
        file_pos_write(file, pos);
        fput_light(file, fput_needed);
    }

    return ret;
}
// @file:fs/read_write.c

    可见它调用的一个关键函数是vfs()_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;
    if (!file->f_op || (!file->f_op->read && !file->f_op->aio_read))
        return -EINVAL;
    if (unlikely(!access_ok(VERIFY_WRITE, buf, count)))
        return -EFAULT;

    ret = rw_verify_area(READ, file, pos, count);
    if (ret >= 0) {
        count = ret;
        if (file->f_op->read)
            ret = file->f_op->read(file, buf, count, pos); /* 调用file->f_op->read()!*/
        else
            ret = do_sync_read(file, buf, count, pos);
        if (ret > 0) {
            fsnotify_access(file);
            add_rchar(current, ret);
        }                                                                                                                                                                                                    
        inc_syscr(current);
    }   

    return ret;
}

EXPORT_SYMBOL(vfs_read);
// @file:fs/read_write.c

    分析上述vfs_read()可知,它最终调用了f_op->read()。在编写设备驱动程序时,很重要的一步就是实现f_op->read(),这里就是调用该f_op->read()的地方!

1.2 write

todo

2 调用

todo

参考资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/611493.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中国地面气候资料日值数据获取方式

数据简介 环境气象数据服务平台提供了全国大约2100个点位,2000年至2023年的逐日数据。包括气温、气压、湿度、风、降水等要素。 数据基于ECMWF reanalysis-era5-land、reanalysis-era5-single-levels 以及中国2100站点地面气候资料日值观测数据,使用机器…

GAMMA Lab——知识图谱和LLM大模型

图机器学习的发展与分类 图基础模型 LLM基础模型 GNN LLM 前沿工作

Box86源码解读记录

1. 背景说明 Github地址:https://github.com/ptitSeb/box86 官方推荐的视频教程:Box86/Box64视频教程网盘 2. 程序执行主体图 Box86版本: Box86 with Dynarec v0.3.4 主函数会执行一大堆的初始化工作,包括但不限于:BOX上下文 …

Golang面向对象编程(一)

文章目录 结构体基本介绍结构体定义方式创建结构体变量结构体内存对齐结构体类型转换字段的Tag标签 方法基本介绍方法的定义和调用方法调用的传参机制String方法 结构体 基本介绍 基本介绍 Go支持面向对象编程特性,包括封装、继承和多态,但Go中没有类&a…

技术创作者在千帆AppBuilder中获得的极致体验

目录 前言 千帆AppBuilder简介 传统的技术文章写作方式 借助千帆AppBuilder提高写作质量和效率 千帆AppBuilder详细搭建步骤 1、注册百度智能云账号 2、登录百度智能云控制台 3、创建千帆AppBuilder应用 4、配置千帆AppBuilder应用 5、调试和发布千帆AppBuilder应用 …

文章分享:《肿瘤DNA甲基化标志物检测及临床应用专家共识(2024版)》

本文摘自于《肿瘤DNA甲基化标志物检测及临床应用专家共识(2024版)》 目录 1. DNA甲基化标志物概述 2 DNA甲基化标志物的临床检测 2.1 临床样本前处理注意事项 2.2 DNA甲基化标志物检测技术方法 2.2.1 DNA提取与纯化 2.2.2 DNA转化 2.2.3 DNA 甲基…

综述列表(~2024.05.10)

(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 每周末更新,完整版进群获取。 Q 群在群文件,VX 群每周末更新。

day5Qt作业

服务器端 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//准备组件,初始化组件状态this->setFixedSize(800,600);chatwidget new QListWidge…

使用Matplotlib绘制正弦和余弦函数曲线

前言 在数据可视化领域,Matplotlib是一个功能强大的Python库,它允许用户创建各种静态、交互式和动画图形。本文将引导您通过一个简单的示例,学习如何使用Matplotlib绘制正弦和余弦函数曲线。 第一步:导入必要的库: …

【智能优化算法】卷尾猴搜索算法(Capuchin search algorithm,CapSA)

【智能优化算法】卷尾猴搜索算法(Capuchin search algorithm,CapSA)是期刊“NEURAL COMPUTING & APPLICATIONS”(IF 6.0)的2021年智能优化算法 01.引言 【智能优化算法】卷尾猴搜索算法(Capuchin search algorithm,CapSA)用于解决约束和全局优化问…

【JVM】垃圾回收机制(Garbage Collection)

目录 一、什么是垃圾回收? 二、为什么要有垃圾回收机制(GC)? 三、垃圾回收主要回收的内存区域 四、死亡对象的判断算法 a)引用计数算法 b)可达性分析算法 五、垃圾回收算法 a)标记-清除…

OSPF虚链路

原理概述 通常情况下,一个OSPF网络的每个非骨干区域都必须与骨干区域通过ABR路由器直接连接,非骨干区域之间的通信都需要通过骨干区域进行中转。但在现实中,可能会因为各种条件限制,导致非骨干区域和骨干区域无法直接连接&#x…

Redis缓存雪崩,击穿,穿透问题

缓存雪崩、击穿、穿透、发生的背景 ​ 作者最近在写一个社区论坛项目,初始设想将论坛里用户发布的帖子内容存到数据库中,当用户访问论坛里的帖子时,帖子信息都从数据库中查。众所周知数据库的帖子数据是存在磁盘中的,而磁盘读写数…

串口初始化自己独立的见解--第九天

1.SM0,SM1 我们一般用 8位UART,波特率可变 (方式1的工作方式) SCON :SM2 一般不用,SM0 0 ,SM1 1 PCON : 有两位 我们不动它,不加速,初始值 TMOD:8位自动重装定时器&#xff0…

ADS基础教程11 - TouchStone文件的导出及导入

目录 一、 T o u c h S t o n e 介绍 \color{#4285f4}{ \mathbf{ 一、TouchStone介绍}} 一、TouchStone介绍 二、文件导出、导入方式 \color{#4285f4}{ \mathbf{ 二、文件导出、导入方式}} 二、文件导出、导入方式1.原理图操作1)原理图中导出2.原理图中导入 3.DDW中…

Python图形复刻——绘制母亲节花束

各位小伙伴,好久不见,今天学习用Python绘制花束。 有一种爱,不求回报,有一种情,无私奉献,这就是母爱。祝天下妈妈节日快乐,幸福永远! 图形展示: 代码展示: …

详解分布式锁

知识点: 单体锁存在的问题: 单体锁,即单体应用中的锁,通过加单体锁(synchronized或RentranLock)可以保证单个实例并发安全 单体锁是JVM层面的锁,只能保证单个实例上的并发访问安全 如果将单…

消除试卷手写笔迹的软件免费的有哪些?这几款都不错

消除试卷手写笔迹的软件免费的有哪些?在数字化学习的浪潮中,学生们越来越频繁地利用电子设备来完成学习任务。然而,当纸质试卷需要被数字化并再次利用时,如何高效地消除手写笔迹便成为了一个有待解决的问题。那么,今天…

【Linux】简易进度条的实现

🎉博主首页: 有趣的中国人 🎉专栏首页: Linux 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好,本片文章将会讲解Linux中进度条的实现的相关内容。 如果看到最后您觉得这篇文章写得…

coherence protocal基础

一致性整体抽象 coherence protocol是通过保证如下的两点invariants,来实现一致性的; SWMR invariant, 对于任何一个地址,任何时刻,都只会有一个core写,可能会有多个core读;Data-value invariant&#xf…
最新文章