查询:消耗资源
中断: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 发送信号给进程
信号的要点
- 先注册一个信号处理函数 signal(SIGUSR1,my_signal);
- 谁来发送信号
- 发给谁
- 谁来接受信号
目标:按下按键时驱动程序通知应用程序
- 应用程序注册信号处理函数
- 谁发送信号:驱动程序
- 发给谁:发给应用程序 app=>告诉驱动自己的PID
- 怎么发: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;
目的:通过驱动程序来通知应用程序 来读某些东西。