移除设备后,libudev udev_device_get_sysattr_value()为idVendor / idProduct返回NULL

时间:2018-12-30 10:02:34

标签: linux usb udev

我正在尝试实现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中是否可以通过其他任何方式仅检测到特定设备?

1 个答案:

答案 0 :(得分:0)

一旦USB设备处于“删除”操作,根据我的经验,udev_device_get_sysattr_value(dev)将返回NULL。甚至之前的“解除绑定”动作也为时已晚。

检测到特定设备被移除的一种方法是在插入设备时存储其dev节点。

首先,通过枚举设备(udev_device*)(已插入设备)并监视“添加”或“绑定”操作,找到要监视的struct udev_enumerate*。 在这些状态下,udev_device_get_sysattr_value将返回您已经看到的正确字符串。如果这些值与您要监视的设备的值匹配,请通过调用udev_device_get_devnode(dev)来检索其当前的dev节点。存储该dev节点值(strdup进行复制)。

在“取消绑定”或“删除”操作中,udev_device_get_devnode(dev)仍将返回正确的值,而不是udev_device_get_sysattr_value(dev, prop_name)。将dev_node与先前存储的dev节点进行匹配,以标识该操作适用于您正在监视的设备。

请注意,每次插入设备时,dev节点可能都会更改。