Linux

如何以程式方式檢測設備何時引發中斷?

  • September 6, 2018

如何以程式方式檢測設備何時引發中斷?這可能是設備連接或斷開連接時。

還有這種情況:例如:當手指放在指紋掃描器上時,會引發中斷。如何檢測並可能擷取此中斷?

我想使用 Gtkmm 編寫一個應用程序,這樣當一個事件發生時,如插入 CD 或插入筆式驅動器,我捕捉到這些設備引發的中斷,並使用它在我的應用程序中做一些涉及這些設備的事情。

如果不能在 Gtkmm 中完成,我可以在較低級別擷取中斷並通知 Gtkmm 應用程序嗎?

我正在檢查 GParted 的行為方式。它最初是顯示/dev/sda的,當我連接我的 pendrive 時,它會自動打開files應用程序。當我檢查 GParted 時,設備的下拉菜單中沒有 pendrive。只有當我在 GParted 菜單中選擇“刷新設備”或Ctrl+時,它才會出現R

我可以嘗試在較低級別擷取中斷並通知 gtkmm 應用程序。

不,這是核心空間活動。幸運的是,核心確實通過使用者態可訪問的介面報告某些事件的結果。

您的問題是要檢測何時連接塊設備還是何時安裝文件系統(儘管它似乎更像是前者),這在您的問題中有點模棱兩可。如果您的系統使用自動掛載(它們通常預設使用),它會在連接塊設備時從塊設備掛載文件系統,否則您必須手動進行(例如,使用mount)。

無論哪種方式,您都希望輪詢/解析/掃描基於核心文件節點的介面。我之前在一個應用程序(實際上是一個 C++ GTK 應用程序)中完成了此操作,該應用程序通過/dev/和跟踪附加的塊設備和掛載的文件系統/etc/mtab。這是一種直接的、與語言無關的方法。有些人一開始覺得它有點反感,因為它涉及到讀取文件/目錄,但這些介面實際上並不存在於磁碟上,因此沒有沉重的 I/O 成本,記住:read()是系統呼叫。在核心介面中讀取文件節點與listAttachedDevices()樣式 API 相同,除了它與語言無關。當您從這些節點讀取數據時,核心會直接將它們表示的資訊傳遞給您。

/dev目錄將連接的設備列為特殊的設備節點文件——例如/dev/sda. 這些是在設備插入和拔出時由核心添加和刪除的,因此如果您通過每隔一段時間(比如每 5 秒)輪詢來跟踪它,您可以檢測到什麼是新的,什麼是消失的。這裡唯一的複雜之處是,由於沒有回調樣式 API,如果您確實想要連續檢查,則必須為此創建自己的執行緒(也許為什麼gparted需要您點擊Refresh Devices)。

一個可能更好的替代方案/dev/sys/block. /dev請注意,和/proc(見下文)或/sys 後者中的節點包含有關設備等事物的資訊之間存在顯著差異,而其中的節點/dev是與設備的實際連接(因此,如果您掃描/dev,請不要不必費心閱讀單個文件,只需注意它們存在)。

/etc/mtabnow-a-days 是指向 ; 的符號連結(另請參見 中的-s切換man ln)是一個主要的瑞士軍刀核心介面(參見 參考資料)。這列出了掛載的文件系統;如果你使用自動安裝,當插入/拔出東西時,東西會從那裡出現和消失。和中的資訊通常是 ASCII 文本的形式,因此您可以使用 等查看這些文件,並使用 string(stream) 函式對其進行解析。/proc/self/mounts``/proc``man proc``/proc``/sys``cat

WRT 到其他類型的設備,例如指紋掃描器,/sys是一個很好的起點——/sys/dev包含一個block和一個char目錄。塊設備通常是儲存;他們的資訊可以隨機訪問。Char 設備以流的形式與系統交換資訊,其中包括掃描器、相機、HID 設備(人機介面設備,例如滑鼠和鍵盤)。我注意到 gtkmm 確實有一些附加的 HID 東西的高級東西,大概是因為這些東西在與 GUI 互動時很重要。

引用自:https://unix.stackexchange.com/questions/144868