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