linux - 删除设备时,libudev udev_device_get_sysattr_value() 为 idVendor/idProduct 返回 NULL
问题描述
我正在尝试实现 USB 监视器服务/守护程序以仅检测特定的 PID/VID 设备。我可以通过过滤 PID/VID 轻松检测设备的“添加”操作属性,但是当我从端口删除任何 USB 设备时,作为“删除”操作属性的一部分,我尝试过滤 PID/VID,就像在“添加”操作中一样。 。 通过使用
const char* vendor = udev_device_get_sysattr_value(dev, "idVendor");
const char* product = udev_device_get_sysattr_value(dev, "idProduct");
但在以上两个 char ptr 中,我总是得到 NULL。因此,我的删除操作将对将从端口删除的所有 USB 设备执行
他们在libudev API中是否有任何其他方式仅检测特定设备删除?
解决方案
根据我的经验,一旦 USB 设备处于“删除”操作,udev_device_get_sysattr_value(dev)
将返回 NULL。即使是之前的“解除绑定”动作也为时已晚。
检测特定设备移除的一种方法是在插入时存储其 dev 节点。
首先,通过枚举设备 ( )(已插入的设备)并监控“添加”或“绑定”操作,找到udev_device*
您要监控的设备。struct udev_enumerate*
在这些状态下,udev_device_get_sysattr_value
将返回您已经看到的正确字符串。如果这些值与您要监视的设备的值匹配,请通过调用检索其当前开发节点udev_device_get_devnode(dev)
。存储该开发节点值(strdup
以制作它的副本)。
在“解除绑定”或“删除”操作中,udev_device_get_devnode(dev)
仍会返回正确的值,而不是udev_device_get_sysattr_value(dev, prop_name)
. 将 dev_node 与先前存储的 dev 节点匹配,以识别该操作适用于您正在监视的设备。
请注意,每次插入设备时,开发节点都可能会发生变化。
推荐阅读
- r - 如何找到每行的 2 个最高值,然后将它们加在一起?
- arrays - 表格中数组数组中数据的填充显示
- node.js - Node.js .env 加载问题文件问题 - 变量加载为未定义
- excel - 多个条件下的 VBA/Macro Vs Manual Solver 不相等
- javascript - 从 API 调用生成一个数字,然后在另一个 API 调用中使用返回的数字作为参数
- xml - 无法在 Google 表格中使用 IMPORTXML 检索 xml 数据
- python - Plotly:如何在甘特图/时间线图中获得定义的颜色条?
- javascript - 访问“空”数组中的子数组
- php - 尝试编写 PHP 单元测试时不推荐使用方法“setMethods”
- reactjs - React - 表单选择图像