異步通知

異步通知:可試應用程序無需一直輪尋數據是否準備好,而只是在數據到達時收到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);







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章