libudev使用說明書


轉http://blog.csdn.net/coroutines/article/details/38067805

1. 初始化
首先調用udev_new,創建一個udev library context。udev library context采用引用記數機制,創建的context默認引用記數為1,使用udev_ref和udev_unref增加或減少引用記數,如果引用記數為0,則釋放內部資源。
2. 枚舉設備
使用udev_enumrate_new創建一個枚舉器,用於掃描系統已接設備。使用udev_enumrate_ref和udev_enumrate_unref增加或減少引用記數。
使用udev_enumrate_add_match/nomatch_xxx系列函數增加枚舉的過濾器,過濾關鍵字以字符表示,如"block"設備。
使用udev_enumrate_scan_xxx系列函數掃描/sys目錄下,所有與過濾器匹配的設備。掃描完成后的數據結構是一個鏈表,使用udev_enumerate_get_list_entry獲取鏈表的首個結點,使用udev_list_entry_foreach遍歷整個鏈表。
3. 監控設備插拔 udev的設備插拔基於netlink實現。
使用udev_monitor_new_from_netlink創建一個新的monitor,函數的第二個參數是事件源的名稱,可選"kernel"或"udev"。基於"kernel"的事件通知要早於"udev",但相關的設備結點未必創建完成,所以一般應用的設計要基於"udev"進行監控。
使用udev_monitor_filter_add_match_subsystem_devtype增加一個基於設備類型的udev事件過濾器,例如: "block"設備。
使用udev_monitor_enable_receiving啟動監控過程。監控可以使用udev_monitor_get_fd獲取一個文件描述符,基於返回的fd可以執行poll操作,簡化程序設計。
插拔事件到達后,可以使用udev_monitor_receive_device獲取產生事件的設備映射。調用udev_device_get_action可以獲得一個字符串:"add"或者"remove",以及"change", "online", "offline"等,但后三個未知什么情況下會產生。

4、獲取設備信息
使用udev_list_entry_get_name可以得到一個設備結點的sys路徑,基於這個路徑使用udev_device_new_from_syspath可以創建一個udev設備的映射,用於獲取設備屬性。獲取設備屬性使用udev_enumerate_get_list_entry,返回一個存儲了設備所有屬性信息的鏈表,使用udev_list_entry_foreach遍歷鏈表,使用udev_list_entry_get_name和udev_list_entry_get_value獲取屬性的名稱和值。

        struct udev*instance = udev_new();
        struct udev_enumerate*enumerate = udev_enumerate_new(instance);//創建一個枚舉器用於掃描已連接的設備。
        
        struct udev_monitor*mon = udev_monitor_new_from_netlink(instance,"kernel");//用於監控設備插拔
        udev_monitor_enable_receiving(mon);啟動監聽
        int fd = udev_monitor_get_fd(mon);獲取文件描述符號
        
        udev_enumerate_scan_devices(enumerate);
        struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate);//返回一個存儲了設備所有屬性信息的鏈表
        
        struct udev_list_entry * dev_list_entry;
        udev_list_entry_foreach(dev_list_entry,devices)//遍歷鏈表
        {
            const char* name = udev_list_entry_get_name(dev_list_entry);//獲取名稱
            struct udev_device*dev = udev_device_new_from_syspath(instance,name);//創建一個udev設備的映射
            //后面具體參考百度雲盤中代碼
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM