转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设备的映射
//后面具体参考百度云盘中代码
}
}

最新文章

  1. GJM :Unity 使用SqlServer数据库 [原创]
  2. C/C++ 中长度为0的数组
  3. 在asp.net 中应用POST传递和接收XML文件以及参数.(转)
  4. POJ C++程序设计 编程题#3 编程作业—文件操作与模板
  5. Python编程中的反模式
  6. C# 实现对网站数据的采集和抓取
  7. MetaData Lock 杨奇龙 ---MYSQL博客专家
  8. ArcGIS API for JavaScript 4.2学习笔记[6] goTo()地图动画
  9. TLD网络资源汇总--学习理解之(四)
  10. 详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解
  11. ---Intel SSD 750 under Linux
  12. 20145232 韩文浩 《Java程序设计》第1周学习总结
  13. tf.estimator.Estimator
  14. New text file line delimiter
  15. antd中fomr中resetFields清空输入框
  16. java中的悲观锁和乐观锁实现
  17. rm 命令(转)
  18. lsnrctl: error while loading shared libraries: /opt/app/oracle/product/11.2/db_1/lib/libclntsh.so.11
  19. MySQL性能调优 – 你必须了解的15个重要变量
  20. MFC中对基于ODBC对数据ACCESS数据库的增删改查。

热门文章

  1. Fiddler使用总结(二)
  2. 完整的正则表达式知识汇总(Python知识不断更新)
  3. (Python爬虫05)完善的爬虫学习大纲
  4. JAVA基础学习之路(十)this关键字
  5. 孤荷凌寒自学python第八十四天搭建jTessBoxEditor来训练tesseract模块
  6. qt qchart缩放后坐标轴间隔取整
  7. POJ 2455 Secret Milking Machine(最大流+二分)
  8. 20145214 《Java程序设计》第8周学习总结
  9. TCP系列17—重传—7、SACK下的重传
  10. OSG配置捷径,VS2013+WIN10