linux驅動程式中的非同步程式設計

2021-07-13 08:32:55 字數 1820 閱讀 6624

linux驅動程式中的非同步程式設計 

a 前面介紹的等待佇列和輪詢程式設計提供了較好的解決裝置訪問的機制,但是這些機制都 

是由應用程式發起的,都需要應用程式主動訪問裝置。更完美的方式是由驅動程式主 

動通知應用程式,也就是說,當驅動程式滿足某些條件後,會主動通知應用程式處理 

,這些處理方式有些像物件導向程式設計的事件,而在linux核心使用的事件是接下來要介 

紹的訊號。 

#include

#include

#include

#include

#include

#include

#define max_len 100  

void input_handler(int num)  //捕獲處理函式 

main()   

b 裝置驅動中非同步通知程式設計比較簡單,主要用到一項資料結構和兩個函式。 

資料結構是 fasync_struct 結構體, 

兩個函式分別如下。  

處理 fasync 標誌變更的函式。  

int fasync_helper(int fd, struct file *filp, int mode, struct fasync_struct **fa);  

釋放訊號用的函式。  

void kill_fasync(struct fasync_struct **fa, int sig, int band);  

和其他的裝置驅動一樣,將 fasync_struct 結構體指標放在裝置結構體中仍然是最 

佳選擇,**清單給出了支援非同步通知的裝置結構體模板。 

struct ***_dev    

;    

在裝置驅動的 fasync() 函式中,只需要簡單地將該函式的 3 個引數以及 

fasync_struct 結構體指標的指標作為第 4 個引數傳入 fasync_helper()函式即 

可。**清單給出了支援非同步通知的裝置驅動程式 fasync()函式的模板。

//處理應用程式的f_setfl命令的fasync函式

static int ***_fasync(int fd, struct file *filp, int mode)    

static  struct file_operations dev_fops= 

在裝置資源可以獲得時,應該呼叫 kill_fasync()釋放 sigio 訊號,可讀時第 3  

個引數設定為 poll_in,可寫時第 3 個引數設定為 poll_out。下面**為釋放訊號 

的範例。 

static ssize_t ***_write(struct file *filp, const char _ _user *buf, size_t count,loff_t *f_pos} 

最後,在檔案關閉時,即在裝置驅動的 release()函式中,應呼叫裝置驅動的  

fasync()函式將檔案從非同步通知的列表中刪除。下面**清單給出了支援非同步通知的 

裝置驅動release()函式的模板。 

static int ***_release(struct inode *inode, struct file *filp)    

應用程式:

開啟兩個終端,乙個執行應用程式,另外乙個執行 echo   "hello" >/dev/裝置名  ,

執行完這條指令後,驅動呼叫write函式,驅動程式中的write函式中會呼叫

kill_fasync(&dev->async_queue, sigio, poll_in);   /* 產生非同步讀訊號 */ ,

這樣應用程式馬上捕捉到sigio,此時應用程式進入處理接受訊號函式。

linux驅動程式中的poll機制程式設計

include include include include include include include include include include include 載入模式後,執行 cat proc devices 命令看到的裝置名稱 define device name key pol...

按鍵驅動程式(非同步通知)

此驅動程式之前的按鍵驅動程式 中斷方式 上加以優化。用到非同步通知。對於核心來講,既然使用者想得到的是按鍵後的狀態,那麼自然不必時時都要 狀態。當它檢測到中斷發生變主動通知使用者,使用者再來讀。這樣,使用者空間 核心就可以著手幹點其它的事情,而不必忙等按鍵按下或釋放。那麼就先從應用程式上面看。怎麼設...

linux 驅動程式 高階字元驅動程式

ioctl方法 驅動程式的原型實現 int ioctl struct inode inode,struct file filp,unsigned int cmd,unsigned long arg ioctl 命令選擇 位段結構 number direction ioc read ioc write...