1. 實現非同步訊號的步驟:
1> 在應用程式中註冊訊號sigio的處理函式
2> 設定處理sigio訊號程序id,即指定訊號由哪個程序來接收
3> 將檔案io模式設定為非同步模組-fasync模式
4> 在驅動中與接收訊號的程序進行關聯
5> 當驅動準備好資料後,向應用傳送訊號通知
2. 應用程式 - 註冊訊號處理方法
#include
sighandler_t signal(int signum, sighandler_t handler);
將signum設定為sigio,handler為處理訊號的函式
3. 應用程式 - 呼叫fcntl()將程序設定為sigio的屬主程序,即指定接收sigio訊號的程序號
fcntl( fd, f_setown, getid() );
4.應用程式 - 呼叫fcntl()將檔案的io模式設定為非同步模式-fasync
int flags = fcntl(fd, f_getfl); // 獲取當前的檔案標誌
fcntl(fd, f_setfl, flags | fasync); // 設定檔案io為非同步模式
5.驅動程式 - 宣告乙個struct fasync_struct型別的變數myfasync用於存放非同步通知相關的資訊。
struct fasync_struct *myfasync; // 存放非同步通知相關資訊
6.驅動程式 - 與接收訊號的程序關聯,即實現fasync()介面
int (*fasync) (int fd, struct file *filp, int on);
在fasync()介面中呼叫fasync_helper()函式來初始化myfasync變數
fasync( int fd, struct file *filp, int on )
// fasync_helper原型如下:
return( fasync_helper( fd, filp, on, & myfasync) );
7.驅動程式 - 在驅動資料準備好時,呼叫kill_fasync()函式傳送訊號
// kill_fasync原型
// kill_fasync( struct fasync_struct **fp, int sig, int band)
kill_fasync( & myfasync, sigio, pollin); // 傳送訊號給應用程式
非同步通知與非同步I O
非同步通知 很簡單,一旦裝置準備好,就主動通知應用程式,這種情況下應用程式就不需要查詢裝置狀態,這是不是特像硬體上常提的 中斷的概念 上邊比較準確的說法其實應該叫做 訊號驅動的非同步i o 訊號是在軟體層次上對中斷機制的一種模擬。阻塞 i o意味著一直等待裝置可訪問再訪問,非阻塞i o意味著使用po...
非同步通知IO模型
同步非同步的關鍵是函式的呼叫時刻和返回時刻與資料傳輸的開始時刻和完成時刻,資料傳輸指輸出或輸入到緩衝。非同步通知io模型 通知io指發生了io相關操作,通知輸入緩衝有資料需要讀取,輸出緩衝無資料可以寫入。select方式是典型的通知io模型,select方式一般是同步通知,select返回時說明有i...
非同步I O之檔案
一 概念 1.1 開啟裝置的操作會向作業系統傳送請求,createfile函式會直接返回,而不會去等待操作完成。1.2 此時作業系統會發現這個請求,然後作業系統會來進行實際的操作,當操作完成之後,1.3 會設定一些標誌,也就是通知。1.4 在作業系統進行實際操作的時候,我可以來做一些想要做的操作,當...