Linux驱动IO篇——异步通知

news2024/10/6 12:33:57

在这里插入图片描述

文章目录

    • 什么是异步通知
    • 异步通知和异步IO的区别
    • 信号含义
    • 应用层使用信号
    • 驱动如何实现异步信号
    • 驱动实例

什么是异步通知


异步通知在Linux的实现中是通过信号,而信号是在软件层次上对中断机制的一种模拟。这种机制和中断非常类似,所以可以以中断的思想来理解这一过程,信号其实就相当于应用层的中断。

信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。

如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。

异步通知和异步IO的区别


异步通知:当资源可获得时,由驱动程序向应用层发送一个信号,主动通知应用程序,再由应用程序发起访问。

异步IO主动获取设备的资源信息,首先发起一个IO操作请求,资源可用时,应用层注册的回调函数会被主动调用。但是异步通知不能直接调用应用层注册的回调函数,而是由驱动程序向应用层发送一个信号

信号含义


信号名含义默认操作
SIGHUP该信号在用户终端连接(正常或非正常)结束时发出,通常是在终端的控制进程结束时,通知同一会话内的各个作业与控制终端不再关联。终止
SIGINT该信号在用户键入INTR字符(通常是Ctrl-C)时发出,终端驱动程序发送此信号并送到前台进程中的每一个进程。终止
SIGQUIT该信号和SIGINT类似,但由QUIT字符(通常是Ctrl-\)来控制。终止
SIGILL该信号在一个进程企图执行一条非法指令时(可执行文件本身出现错误,或者试图执行数据段、堆栈溢出时)发出。终止
SIGFPE该信号在发生致命的算术运算错误时发出。这里不仅包括浮点运算错误,还包括溢出及除数为0等其它所有的算术的错误。终止
SIGKILL该信号用来立即结束程序的运行,并且不能被阻塞、处理和忽略。终止
SIGALRM该信号当一个定时器到时的时候发出。终止
SIGSTOP该信号用于暂停一个进程,且不能被阻塞、处理或忽略。暂停进程
SIGTSTP该信号用于暂停交互进程,用户可键入SUSP字符(通常是Ctrl-Z)发出这个信号。暂停进程
SIGCHLD子进程改变状态时,父进程会收到这个信号忽略
SIGABORT该信号用于结束进程终止

当应用层接收到一个信号时,可以对信号执行忽略、捕捉和缺省三种操作:

忽略信号:对信号不做任何处理,但是有两个信号不能忽略:即SIGKILLSIGSTOP

捕捉信号:定义信号处理函数,当信号发生时,执行相应的处理函数。

缺省信号:执行Linux对该信号的默认操作

应用层使用信号


以下是应用层捕捉SIGIO信号的简单示例:

void input_handler(int signum)
{
    //如果驱动发送了SIGIO信号,在此处理
  printf("recive from %d\n",signum);
 
}
int main()
{
  int fd ,oflags;
  fd=open("/dev/global",O_RDWR,S_IRUSR | S_IWUSR);
 if(fd != -1)
{
  //启动信号机制
  signal(SIGIO,input_handler);//设置SIGIO信号的处理函数
     
  fcntl(fd,F_SETOWN,getpid());//将进程ID赋值给filp->f_owner
     
  oflags = fcntl(fd,F_GETFL);
  fcntl(fd,F_SETFL,oflags | FASYNC);//驱动的fasync方法被调用
     
  while(1)
  {
    sleep(1000);
  }
}
}
  • 当应用层F_SETOWN, 驱动什么都没做,内核只是将进程的ID赋值给 filp->f_owner
  • 当应用层F_SETFL 被执行来打开 FASYNC, 驱动fasync 方法被调用.
  • 当数据到达, 驱动向进程发出一个 SIGIO 信号

驱动如何实现异步信号


驱动的实现主要用到一个结构体两个函数

fasync_struct结构体:

struct fasync_struct {                                    
        spinlock_t              fa_lock;
        int                     magic;
        int                     fa_fd;
        struct fasync_struct    *fa_next; /* singly linked list */
        struct file             *fa_file;
        struct rcu_head         fa_rcu;
};

函数:

fasync_helper():用于处理FASYNC标志变更

fasync_helper()函数是用来初始化fasync_struct结构体变量,并设置异步通知队列的

int fasync_helper(int fd, 	         	//文件描述符	
	struct file * filp, 		//文件指针
	int on, 
	struct fasync_struct **fapp);   //要设置的结构

第三个参数on表示设置还是删除,on为真时初始化,为假时(0),移除.

kill_fasync():发送信号

void kill_fasync(struct fasync_struct **fp, int sig, int band)

fp:是已初始化的fasync_struct数据结构

sig:要发送的信号

band:在可读时设置为POLL_IN,在可写时设置为POLL_OUT;

驱动实例


static struct fasync_struct *btn_fasync;

static irqreturn_t btn_irq_handler(int irq, void *dev)
{
	struct btn_t *p = (struct btn_t *)dev;
    
    //发送信号
	kill_fasync(&btn_fasync, SIGIO, POLL_IN);
    
    return IRQ_HANDLED;
}

static int btn_drv_fasync(int fd, struct file *fp, int on)
{
	//初始化btn_fasync结构,并添加到异步通知列表中
	return fasync_helper(fd, fp, on, &btn_fasync);
}

static int btn_drv_close(struct inode *inode, struct file *filp)
{
	if(filp->f_flags & FASYNC)
        fasync_helper(-1, flip, 0, &btn_fasync);//将文件从异步通知的列表中删除
	return 0;
}

static struct file_operations btn_ops={
	......
    .release = btn_drv_close,
	.fasync = btn_drv_fasync,
};

主要步骤

1、构造struct fasync_struct链表的头

2、实现fasync接口函数,调用fasync_helper函数来构造struct fasync_struct节点,并加入链表。

3、在资源可用时,调用kill_fasync发送信号,并设置资源的可用类型是可读还是可写。

4、在文件最后一次关闭时,即在release接口中,需要显式调用驱动实现的fasync接口函数,将节点从链表中删除,这样进程就不会再次收到信号。

异步通知主要还是弄明白信号是软件层次对中断的一种模拟,并且信号是由驱动发出的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI绘画:如何让图片开口说话生成视频?变现渠道有哪些?

如何让AI绘画做出来的视频可以开口说话,本篇文章给你讲解清楚。 这个项目市面上有很多种叫法,AI数字人,图片说话,图片数字人等等。 废话不多说,直接以AI小和尚为例进行实操。 1.生成图片: 用Midjourney…

操作系统期末复习笔记

文章目录 操作系统第1章 计算机系统概述1 指令执行的基本指令周期2 中断分类与中断处理过程2.1 中断的定义2.2 中断分类2.3 中断的意义2.4 无中断2.5 有中断2.6 中断和指令周期2.7 中断处理的过程 3 处理多中断的两种方法3.1 顺序中断处理(禁止中断)3.2 …

大数据-玩转数据-Flink恶意登录监控

一、恶意登录 对于网站而言,用户登录并不是频繁的业务操作。如果一个用户短时间内频繁登录失败,就有可能是出现了程序的恶意攻击,比如密码暴力破解。 因此我们考虑,应该对用户的登录失败动作进行统计,具体来说&#x…

批量获取CSDN文章对文章质量分进行检测,有助于优化文章质量

📚目录 ⚙️简介✨分析获取步骤⛳获取文章列表☘️前期准备✨ 接口解析⚡️ 获取文章的接口 ☄️文章质量分接口⭐接口分析 ⌛代码实现:⚓核心代码:⛵测试用例:⛴ 运行效果:☘️增加Excel导出 ✍️结束 ⚙️简介 有时候我们写文章是为了记录当下遇到的bu…

乙方策划人员的内心独白:写不完的案子,是工作的常态吗?

在某种程度上来说,这是对的。 如果是年轻人来说,在甲方当策划就是当执行,只有积累一定经验才能真正实行策划任务、 而在乙方做策划那就是纯纯的策划,也就是你说的每天写不完的案子。 对于普通人的职场选择往往是就近选择&#…

服务治理平台:SOA与微服务架构的对比与区别

文章目录 1、场景引入2、面向服务的架构SOA3、微服务架构4、对比与联系5、服务治理平台 1、场景引入 如果我们打开支付宝首页,去看我们的余额,它会展示你的总资产,昨日收益、累计收益等信息。假如这个页面所展示的信息,都来自各个…

非常详细的trunk-based分支管理流程配置及使用

非常详细的trunk-based分支管理流程配置及使用。 目前业界主流的版本管理流程是Gitflow 和 trunk-based。 Gitflow流行的比较早。但是目前的流行度要低于 trunk-based模式工作流。trunk-based模式被誉为是现代化持续集成的最佳实践。 他俩的核心区别是,Gitflow是一个更严格…

格式化文件恢复软件有哪些 格式化文件恢复软件怎么用

格式化是指对磁盘或者磁盘中的分区进行初始化的一种操作,但是这种操作会造成磁盘内数据的清除。因此,当我们需要恢复一些数据时,就要借助相关数据恢复软件的帮助,那么下面就来给大家介绍格式化文件恢复软件有哪些,格式…

ORB-SLAM2_RGBD_DENSE_MAP编译、问题解决、离线加载TUM数据和在线加载D435i相机数据生成稠密地图

文章目录 0 引言1 安装依赖1.1 其他库安装1.2 pcl库安装 2 编译ORB-SLAM2_RGBD_DENSE_MAP2.1 build.sh2.2 build_ros.sh 3 运行ORB-SLAM2_RGBD_DENSE_MAP3.1 build.sh编译版本3.2 build_ros.sh编译版本 0 引言 ORB-SLAM2_RGBD_DENSE_MAP是基于ORB-SLAM2框架的一种RGB-D稠密地图…

【C++】LeetCode 160 相交链表

今天再写一道算法题(这两周都写算法题有点摆烂) 题目 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交&#xff1…

第17篇ESP32 platformio_arduino框架 AP热点与AP+STA同时存在模式

笔记本连接ESP32后,串口打印连接状态: 第1篇:Arduino与ESP32开发板的安装方法 第2篇:ESP32 helloword第一个程序示范点亮板载LED 第3篇:vscode搭建esp32 arduino开发环境 第4篇:vscodeplatformio搭建esp32 arduino开发环境 ​​​​​​第5篇:doit…

影楼管理系统软件erp如何通过快解析发布到外网登录访问

影楼管理系统也叫影楼ERP软件,即影楼信息化管理系统,通常集成了选片、影楼流程管理、婚纱礼服、影楼财务、影楼客服、影楼接单等多功能为一身的影楼app管理。通过影楼管理系统把客户关系管理理念引入影楼管理,有序而全面的建立客户资料库&…

【9】openGL调用imGUI使用其自带例子测试

参考视频 去github下载imgui源码,得到 将根目录下所有.h .cpp文件复制到你的项目文件夹imgui下面。 进入exmaple文件夹,可以看到例子 这是它调用的头文件 在backends里找到你需要的 .h .cpp文件,总共四个文件,复制过来 你的项…

使用阿里云无影云电脑能干什么?

阿里云无影云电脑是一种易用、安全、高效的云上桌面服务,阿里云无影云电脑可用于高数据安全管控、高性能计算等要求的金融、设计、视频、教育等领域,适用于多种办公场景,如远程办公、多分支机构、安全OA、短期使用、专业制图等。阿里云百科来…

Java基于微信小程序的电影交流平台

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 第一章:简介第二章、开发环境:后端:前端:数据库&…

阿里云无影云电脑介绍_云办公_使用_价格和优势说明

什么是阿里云无影云电脑?无影云电脑(原云桌面)是一种快速构建、高效管理桌面办公环境,无影云电脑可用于远程办公、多分支机构、安全OA、短期使用、专业制图等使用场景,阿里云百科分享无影云桌面的详细介绍、租用价格、…

Android Media3 ExoPlayer 开启缓存功能

ExoPlayer 开启播放缓存功能,在下次加载已经播放过的网络资源的时候,可以直接从本地缓存加载,实现为用户节省流量和提升加载效率的作用。 方法一:采用 ExoPlayer 缓存策略 第 1 步:实现 Exoplayer 参考 Exoplayer 官…

Docker 部署 Bitwarden RS 服务

Bitwarden RS 服务是官方 Bitwarden server API 的 Rust 重构版。因为 Bitwarden RS 必须要通过 https 才能访问, 所以在开始下面的步骤之前, 建议先参考 《Ubuntu Nginx 配置 SSL 证书》 配置好域名和 https 访问。 部署 Bitwarden RS 拉取最新版本的 docker.io/vaultwarden…

快递、外卖、网购自动定位及模糊检索收/发件地址功能实现

概述 目前快递、外卖、团购、网购等行业 :为了简化用户在收发件地址填写时的体验感,使用辅助定位及模糊地址检索来丰富用户的体验 本次demo分享给大家;让大家理解辅助定位及模糊地址检索的功能实现过程,以及开发出自己理想的作品…

【Java】应用层协议HTTP和HTTPS

HTTP和HTTPS协议 HTTPHTTP协议的工作过程HTTP协议格式抓包工具抓包结果 HTTP请求(Request)URL方法GET方法POST请求其他方法 报头(header)HostContent-lengthContent-TypeUser-AgentRefererCookie 正文(body) HTTP响应HTTP状态码响应报头(header)响应正文(body) 通过form表单构造…