按下按鍵是驅動程式通知應用程式
應用程式裡面要註冊訊號處理函式
驅動程式給應用程式發訊號
發給誰,這就要應用程式告訴驅動pid了
怎麼發,是驅動裡面呼叫kill_fasync
為了使裝置支援非同步通知機制,驅動程式涉及以下3項工作
1.支援f_setown命令,能在這個控制命令處理中設定filp->f_owner為對應程序id
不過此項工作已經有核心完成,裝置驅動無需處理
2.支援f_setfl命令的處理,每當fasync標誌改變時,驅動程式中的fasync()函式將得以執行
驅動中應該實現fasync函式
3.在裝置資源可以獲得時,呼叫kill_fasync()函式激發相應的訊號
應用程式會呼叫fcntl(fd,f_setown,pid)把它的pid告訴驅動程式
然後還要讀出flags
oflags = fcntl(fd,f_getfl)
要把這個flag進行修改fcntl(fd,f_setfl,oflags | fasync);當應用程式呼叫這個介面的時候,fasync_helper就會被呼叫
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int key_id;
struct cdev cdev;
dev_t devno;
static struct fasync_struct *button_fasync;
/*定義並初始化等待佇列的頭*/
static declare_wait_queue_head(key_qaq);
/*中斷事件標誌,中斷服務程式將它置為1,read函式將它置為0*/
unsigned int wait_val=0;
struct class *my_class;
static irqreturn_t key_func(int irq,void *dev_id)
static int key_open(struct inode *inode,struct file *file)
static int key_close(struct inode *inode,struct file *file)
ssize_t key_read(struct file *filp, char __user *buf, size_t size,loff_t *pos)
static int key_fasync(int fd,struct file *filp,int on)
static unsigned key_poll(struct file *file, poll_table *wait)
static struct file_operations key_fops =
;static int __init key_fasync_init(void)
device_create(my_class, null, devno,null,"key_fasync_driver");
return 0;
}static void key_fasync_exit(void)
module_init(key_fasync_init);
module_exit(key_fasync_exit);
module_license("gpl");
module_author("eight_five");
測試程式如下:
#include
#include
#include
#include
#include
#include
#include
#include
int fd;
void my_signal_func(int signum)
int main(int argc,char **argv)
fcntl(fd,f_setown,getpid());
flag=fcntl(fd,f_getfl);
fcntl(fd,f_setfl,flag | fasync);
while(1);
return 0;
}
按鍵驅動程式(非同步通知)
此驅動程式之前的按鍵驅動程式 中斷方式 上加以優化。用到非同步通知。對於核心來講,既然使用者想得到的是按鍵後的狀態,那麼自然不必時時都要 狀態。當它檢測到中斷發生變主動通知使用者,使用者再來讀。這樣,使用者空間 核心就可以著手幹點其它的事情,而不必忙等按鍵按下或釋放。那麼就先從應用程式上面看。怎麼設...
linux裝置驅動中的非同步通知機制
非同步通知的意思是 一旦裝置就緒,則主動通知應用程式,這樣應用程式根本就不需要查詢裝置狀態,這一點非常類似於硬體上 中斷 的概念,比較準確的稱謂是 訊號驅動的非同步i o 訊號是在軟體層次上對中斷機制的一種模擬,在原理上,乙個程序收到乙個訊號與處理器收到乙個中斷請求可以說是一樣的.訊號是非同步的,乙...
驅動實現非同步通知
在應用層中,通過非同步通知的機制來處理隨時發生的事件。例如用signal來俘獲訊號 void handler int main 如果想讓裝置檔案擁有非同步通知機制,那麼,在主函式中是這樣實現的 int main 完成了這些,在核心相對應的file結構體就會被設定成上面的樣子,也就是擁有了fasync...