08 异步通知

第5课.异步通知
代码

编程指南

应用态

  • 在应用态使用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
posted @ 2023-03-09 22:03  人民广场的二道贩子  阅读(19)  评论(0编辑  收藏  举报