查詢:消耗資源
中斷: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;
?
?
?
?
目的:通過驅動程序來通知應用程序 來讀某些東西。
?