08 异步通知
编程指南
应用态
- 在应用态使用signal函数处理
- 应用态需要打开对应的驱动
- 将进程ID传递给驱动(getpid)
驱动
- 记录pid
- 使能file中f_flags为FASYNC
- 事件触发时通过kill_fasync发出信号
1. 异步通知原理
应用程序不休眠,不阻塞。事件触发了才会去处理。
驱动程序向应用程序发送信号;常用信号类型SIGIO表示有IO时间触发
引用百问网图片
2. 函数解析
2.1 fcntl
int fcntl(int fd, int cmd, ... /* arg */ );
fcntl函数有5种功能:
- 复制一个现有的描述符 (cmd=F_DUPFD)
- 获得/设置文件描述符标记 (cmd=F_GETFD或F_SETFD).
- 获得/设置文件状态标记 (cmd=F_GETFL或F_SETFL).
- 获得/设置异步I/O所有权 (cmd=F_GETOWN或F_SETOWN).
- 获得/设置记录锁 (cmd=F_GETLK,F_SETLK或F_SETLKW).
2.2 fasync_helper
int fasync_helper(int fd, struct file * filp, int on, struct fasync_struct **fapp)
需要定义一个struct fasync_struct **fapp;用于储存进程传递给文件系统中存起来的pid,并将其存放在struct fasync_struct **fapp ->fa_file中。
当kill_fasync需要寻找进程pid时,可以从中获取
2.3 kill_fasync
void kill_fasync(struct fasync_struct **fp, int sig, int band)
sig : 信号种类(SIGIO)
band : 读: 设置为POLL_IN; 写: 设置为POLL_oUT
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
2020-03-09 第1课.Linux驱动的概述