首页 > 解决方案 > 删除设备时,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中是否有任何其他方式仅检测特定设备删除?

标签: linuxusbudev

解决方案


根据我的经验,一旦 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 节点匹配,以识别该操作适用于您正在监视的设备。

请注意,每次插入设备时,开发节点都可能会发生变化。


推荐阅读