前言

14. 异步通知

本章内容为驱动基石之一

驱动只提供功能,不提供策略

阻塞与非阻塞是 APP 询问 驱动设备。

异步通知是 驱动设备 主动通知 APP。

原文:https://www.cnblogs.com/lizhuming/p/14918049.html

14.1 异步通知的一些概念

异步通知:一旦设备就绪,则主动通知APP,这样APP就不用轮询查询设备状态了。

异步IO:APP 发起 IO 请求后,立即返回。然后再查询 IO 完成情况,或者 IO 完成后被调回。这个过程叫做 异步IO

14.2 Linux 信号

可以使用 信号 来进行进程间通信(IPC)。

Linux信号表:

  • 路径参考:include\uapi\asm-generic\signal.h
信号 说明
SIGHUP 1 挂起
SIGINT 2 中断中断
SIGQUIT 3 终端退出
SIGILL 4 无效命令
SIGTRAP 5 跟踪陷阱
SIGABRT 6 异常终止信号,和 SIGIOT 同义
SIGIOT 6 IOT陷阱,和 SIGABRT 同义
SIGBUS 7 BUS错误
SIGFPE 8 浮点异常
SIGKILL 9 强制终止
SIGUSR1 10 用户自定义信号1
SIGSEGV 11 无效的内存段处理
SIGUSR2 12 用户自定义信号2
SIGPIPE 13 半关闭管道的写操作
SIGALRM 14 计时器到期
SIGTERM 15 终止
SIGSTKFLT 16 堆栈错误
SIGCHLD 17 子进程已经停止或退出
SIGCONT 18 如果停止了,继续执行
SIGSTOP 19 停止执行
SIGTSTP 20 终端停止信号
SIGTTIN 21 后台进程需要从终端读取输入
SIGTTOU 22 后台进程需要从终端写出
SIGURG 23 紧急的套接字事件
SIGXCPU 24 超额使用CPU分配的时间
SIGXFSZ 25 文件尺寸超额
SIGVTALRM 26 虚拟时钟信号
SIGPROF 27 时钟信号描述
SIGWINCH 28 出口尺寸变化
SIGIO 29 I/O
SIGPOLL SIGIO I/O

除了 SIGSTOPSIGKILL 两个信号外,进程能够忽略或捕获其它所有信号。

一个信号被捕获的意思是当一个信号到达时有相应代码处理它。

如果一个信号没有被这进程所捕获,内核将采取默认行为处理。

14.3 信号接收

14.4 使用流程

14.4.1 参考流程图

流程图参考韦东山:

14.4.2 分析&编程步骤

分析中的细节部分会在后本节后面说明

分析:

  • ②:绑定信号与回调函数。使用sighandler_t signal(int signum, sighandler_t handler)

  • ③:把 APP PID 告诉内核。同时,该 PID 会保存到该驱动的内核文件 file 结构体中。

  • ④:读取该驱动程序文件的 Flag。

  • ⑤:设置 Flag 里面的 FASYNC 位为 1。当 FASYNC 位发生变化时,该驱动会调用驱动操作 drv_fasync 函数。

  • ⑥:驱动开发者实现的函数。主要是调用 fasync_helper 函数。

  • ⑦:调用 fasync_helper() 函数,主要是把 驱动程序内核文件 file 结构体绑定到 button_async->fa_file 中。而 file 包含了 APPPID。所以发送信号时,只需要使用 button_async 作为参数即可。

  • ⑩:发送信号给对应的 APP。参数为 button_async

  • 注:button_async 结构体由驱动开发者创建,维护。

APP 信号编程步骤

  • ①:编写信号回调函数。
  • ②:绑定信号与回调函数。
  • ③:打开驱动。
  • ④:获取 PID ,告知内核。
  • ⑤:获取进程状态值。
  • ⑥:当前状态值添加异步功能,出发调用驱动异步处理函数。

KERNEL 信号编程步骤

  • ①:定义异步结构体。
  • ②:实现异步操作函数,并把该函数填充到设备内核驱动操作结构体中。
    • 该函数内容主要调用 fasync_helper() 函数,初始化异步结构体。(把 file ,内核PID,交给异步结构体
  • ③:发送信号。

14.4.3 使用函数说明

14.4.3.1 相关结构体及参考模型

APP 模型 截段:

......

/* 设置信号 SIGIO 的处理函数 */
signal(SIGIO, sigio_signal_func); fcntl(fd, F_SETOWN, getpid());  /* 将当前进程的进程号告诉给内核  */
flags = fcntl(fd, F_GETFD);    /* 获取当前的进程状态 */
fcntl(fd, F_SETFL, flags | FASYNC); /* 设置进程启用异步通知功能。会调用驱动中的 drv_fasync 函数 */ ......

fasync_struct

  • (在内核源码中,目前没有去找内核文档该结构体内容的相关信息)
struct fasync_struct {
rwlock_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;
};
14.4.3.2 signal 函数

APP 使用

函数原型sighandler_t signal(int signum, sighandler_t handler) :

  • 功能:绑定信号与回调函数。
  • signum:信号类型。除 SIGKILLSIGSTOP 外的任何一种信号。
  • handler:该参数有三种类型。
    • ①:SIG_IGN 类型。表示忽略该信号。
    • ②:SIG_DFL 类型。表示恢复对信号的系统默认处理。
    • ③:sighandler_t 类型的函数指针。即是回调函数。typedef void (*sighandler_t)(int);
  • 注:APP 收到信号执行回调函数时,signum 参数会被传到回调函数的形参传递给回调函数。即是回调函数的形参就是信号类型。
14.4.3.3 kill_fasync 函数

KERNEL 使用

函数原型void kill_fasync(struct fasync_struct **fp, int sig, int band) :

  • 功能:发送信号给 fp 参数绑定的进程。(by PID
  • 参考路径:linux-5.12.8\fs\fcntl.c
  • fp:需要操作的 fasync_struct
  • sig:信号类型。
  • band:可读时设置为 POLL_IN;可写时设置为 POLL_OUT。当然该参数还可以填

    POLL_MSG。以上三个值在应用层接收时,si_code 分别为 0x01、0x02、0x03。

【linux】驱动-14-异步通知的更多相关文章

  1. Linux驱动之异步通知的应用

    前面的按键驱动方式都是应用程序通过主动查询的方式获得按键值的: 1.查询方式 2.中断方式 3.poll机制 下面介绍第四种按键驱动的方式 4.异步通知:它可以做到应用程序不用随时去查询按键的状态,而 ...

  2. linux驱动的异步通知(kill_fasync,fasync)---- 驱动程序向应用程序发送信号

    应用程序 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include < ...

  3. 蜕变成蝶~Linux设备驱动之异步通知和异步I/O

    在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问.因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似“中断”的异步通知所取代.异步通知类 ...

  4. linux下使用异步通知

    阻塞式I/O是一直等待直到设备可以访问,非阻塞式I/O是定期轮询设备是否可以访问. 异步通知则是当设备可以访问时才主动通知应用程序,有点像设备的硬中断. 并不是所有的设备都支持异步通知,应用程序通常假 ...

  5. Linux通信之异步通知模式

    [参考]韦东山 教学笔记 为了使设备支持异步通知机制,驱动程序中涉及以下3项工作:1. 支持F_SETOWN命令,能在这个控制命令处理中设置filp->f_owner为对应进程ID. 不过此项工 ...

  6. Linux驱动之异步OR同步,阻塞OR非阻塞概念介绍

    链接:https://www.zhihu.com/question/19732473/answer/20851256 1.同步与异步同步和异步关注的是消息通信机制 (synchronous commu ...

  7. Linux学习 :按键信号 之 异步通知

    一.异步通知概念: 异步通知是指:一旦设备就绪,则主动通知应用程序,应用程序根本就不需要查询设备状态,类似于中断的概念,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进 ...

  8. linux异步通知

    简述 linux下异步方式有两种:异步通知和异步IO(AIO),aio请参考:linux异步IO--aio 异步通知的含义是:一旦设备就绪,则主动通知应用程序,这样应用程序就不需要查询设备状态,准确称 ...

  9. Linux内核开发之异步通知与异步I/O(一)

    “小王,听说过锦上添花吧..”我拍拍下王的头说. “还锦上添花你,为你上次提的几个东东,我是头上长包..”小王气愤地瞪着我. “啊,为啥这样呢,本来还特意拒绝了MM的月份,抽出时间打算给你说点高级的东 ...

随机推荐

  1. raft协议

    一.Raft一致性算法 Eureka:Peer To Peer,每个节点的地位都是均等的,每个节点都可以接收写入请求,每个节点接收请求之后,进行请求打包处理,异步化延迟一点时间,将数据同步给 Eure ...

  2. Smss.exe加载win32k.sys过程总结

    windows操作系统初始化 windows操作系统再初始化的过程中,当内核完全初始化而且各个组件也已经准备好后会加载一个个用户进程smss.exe(会话管理器),此进程会接着调用NtSetSyste ...

  3. .Net Core with 微服务 - 架构图

    上一次我们简单介绍了什么是微服务(.NET Core with 微服务 - 什么是微服务 ).介绍了微服务的来龙去脉,一些基础性的概念.有大佬在评论区指出说这根本不是微服务.由于本人的能力有限,大概也 ...

  4. 为什么数字被int格式化后依旧可以用%s占位(勉强已答)

    为什么数字被int格式化后依旧可以用%s占位 答:可以看作str(obj)

  5. ES6学习-0 前言

    本菜鸟做了二十来年的程序开发了,前后台都写过,队伍也带过.大约是2000年左右,是用dephi 写后台CGI,所有的html,js,css基本都是混在CGI里输出到前台的,那时也没有明确的前后台的概念 ...

  6. osg纯手工画球+贴纹理

    手动计算球面顶点的坐标,纹理坐标,来画球并贴纹理 其中createSphereGeom()函数的的二个参数为18,意思是在经纬度上每10度设一个点,因为经度一共是180度,180/18=10,相当于横 ...

  7. CSS filter 有哪些神奇用途

    背景 基本概念 CSS filter 属性将模糊或颜色偏移等图形效果应用于元素形成滤镜,滤镜通常用于调整图像,背景和边框的渲染.它的值可以为 filter 函数 <filter-function ...

  8. SDK安全测试

    设备调试 strace MI 5X 链接:https://pan.baidu.com/s/1KfsfEgjniozXGUD_69m0SQ 提取码:mulo 推strace到手机中 adb push s ...

  9. 神奇的不可见空格<200b>导致代码异常

    故事是这样发生的,在做一个JSON对象转化的时候,出现了转化异常:刚开始还是以为是格式错误,后来一步步排除,才发现是不可见空格<200b>导致的解析异常 出现 使用Typora编写文字时, ...

  10. golang:正则表达式总结

    正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具.虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活.按照它的语法规则,随需构造出的匹配模式就能够从原始文本中筛选出几乎任何你想要得到的字符 ...