Linux通訊之非同步通知模式

2022-05-21 10:40:40 字數 489 閱讀 4532

【參考】韋東山 教學筆記

為了使裝置支援非同步通知機制,驅動程式中涉及以下3項工作:

1. 支援f_setown命令,能在這個控制命令處理中設定filp->f_owner為對應程序id。

不過此項工作已由核心完成,裝置驅動無須處理。

2. 支援f_setfl命令的處理,每當fasync標誌改變時,驅動程式中的fasync()函式將得以執行。

驅動中應該實現fasync()函式。

3. 在裝置資源可獲得時,呼叫kill_fasync()函式激發相應的訊號

應用程式:

fcntl(fd, f_setown, getpid()); // 告訴核心,發給誰

oflags = fcntl(fd, f_getfl);

fcntl(fd, f_setfl, oflags | fasync); // 改變fasync標記,最終會呼叫到驅動的faync > fasync_helper:初始化/釋放fasync_struct

linux驅動學習之非同步通知

非同步通知是裝置狀態改變後主動通知應用程式,這樣應用程式就不需要阻塞或查詢裝置了。應用通過訊號來處理核心的非同步通知,上次使用poll select來查詢裝置的可讀狀態,下面這個例子類似,不同的是當裝置有資料時主動通知應用去讀資料。應用的c 很簡單,主要設定對訊號的處理方式,核心有資料時會收到sig...

Linux非同步通知 fasync

要弄明白這個問題,我們得從最基本的原理開始。我們知道,驅動程式執行在核心空間中,應用程式執行在使用者空間中,兩者是不能直接通訊的。但在實際應用中,在裝置已經準備好的時候,我們希望通知使用者程式裝置已經ok,使用者程式可以讀取了,這樣應用程式就不需要一直查詢該裝置的狀態,從而節約資源,這就是非同步通知...

Linux非同步通知fasync

實現非同步通知,核心需要知道幾個東西 哪個檔案 filp 什麼訊號 sigiio 發給哪個程序 pid 收到訊號後做什麼 sig handler 這些都由前兩個步驟完成了。在這裡,同樣需要把乙個結構體 struct fasync struct 新增到核心的非同步佇列頭 名字是我自己取的 中。這個結構...