liunx驱动----异步通知

查询:消耗资源

中断:read 一直要去读
poll :指定起始时间
异步通知
signal 测试程序
include <stdio.h>
include <signal.h>

void my_signal(int signum)
{
static unsigned int cnt;
printf(
"signum = %d, %d timer\n",signum ,++cnt);//liunx 命令行中是行缓冲的。
}
int main(int argc,char **argv)
{
signal(SIGUSR1,my_signal);
while(1)
{
sleep(
1000);
}
return 0;
}


kill -USR1 PID  发送信号给进程

 

信号的要点
  1. 先注册一个信号处理函数 signal(SIGUSR1,my_signal);
  2. 谁来发送信号
  3. 发给谁
  4. 谁来接受信号
目标:按下按键时驱动程序通知应用程序
  1. 应用程序注册信号处理函数
  2. 谁发送信号:驱动程序
  3. 发给谁:发给应用程序 app=> 告诉驱动自己的 PID
  4. 怎么发:kill_fasync()

在应用程序中:

signal(SIGIO,my_signal);// 开启异步通知
 
fcntl(fd, F_SETOWN, getpid());// 获取自身的 PID getpid() 也就是确定发给谁这个问题
 
Oflags = fcntl(fd, F_GETFL); // 获取当前的 flag
 
fcntl(fd, F_SETFL, Oflags | FASYNC);// 修改当前 Flag 设置为异步通知的 Flag
在驱动程序中
通知应用程序有信号来了
fasync_helper(fd, file, on, &button_signal); 的目的是为了 初始化 button_signal
button_signal 在文件中定义:static struct fasync_struct *button_signal;
 
 
目的:通过驱动程序来通知应用程序 来读某些东西