異步通知:可試應用程序無需一直輪尋數據是否準備好,而只是在數據到達時收到SIGIO通知。
異步通知機制
應用程序方面:
執行的兩個步驟:
1 指定進程作爲文件的屬主:讓內核知道數據到達時通知哪個進程: fcntl(fileno,F_SETOWN,getid());
2設置FASYNC標誌,啓用異步通知機制。oflags=fcntl(fileno, F_GETFL) fcntl( fileno, F_SETFL, flags|FASYNC)
完成這兩步後新書據到達時就發送SIGIO信號到應用程序,應用程序通過signal設置SIGIO的處理函數來處理接受的數據
驅動程序方面
執行三個步驟:
1 當F_SETOWN被調用時,對filp->owner賦值
2 在應用程序執行第二步時,內核調用驅動程序的fasync方法(FASYNC變化時就會調用該方法)
3 數據到達時發送SIGIO給註冊的異步通知進程
實現一個數據結構和兩個函數
數據結構 struct fasync_struct內核已經提供
struct fasync_struct
{
int magic;
int fa_fd;
struct fasync_struct *fa_next;
/* singly linked list */
struct file *fa_file;
};
函數1:fasync_helper(int fd, struct file *filp, int mode, struct fasync_struct **fa); 實現步驟二 從相關進程列表中刪除或增加文件
函數2:kill_fasync( struct fasync_struct ** fa, int sig, int band); 實現步驟三
band 對於用來通知可讀的異步通知:band幾乎總是爲poll_in
對於用來通知可寫的異步通知:band幾乎總是爲poll_out
最後注意在文件關閉之前,必須調用fasync方法,以便從活動的異步讀取進程列表中刪除文件。
scull_p_fasync(-1,filp,0);