异步通知机制的作用是,可以让驱动通知应用去读取数据。
进程间发信号用:kill -信息 PID(进程号)
PID(进程号)可在终端用ps查询
驱动中:
static struct fasync_struct *button_async; file_operations: .fasync = sixth_drv_fasync static int sixth_drv_fasync (int fd, struct file *filp, int on) { printk("driver: sixth_drv_fasync\n"); return fasync_helper (fd, filp, on, &button_async); //初始化button_async结构体 } kill_fasync (&button_async, SIGIO, POLL_IN);//发送信息SIGIO给应用程序
应用程序中:
signal(SIGIO, my_signal_fun);//接收到SIGIO就执行my_signal_fun fcntl(fd, F_SETOWN, getpid());//告诉驱动它的PID Oflags = fcntl(fd, F_GETFL); fcntl(fd, F_SETFL, Oflags | FASYNC);//改变fasync标记,最终会调用到驱动的fasync>fasync_helper:初始化/释放fasync_struct
signal(参数1,参数2);
参数1:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(共64个)。其实这些信号时系统定义的宏。
参数2:我们处理的方式(是系统默认还是忽略还是捕获)