我正在尝试实现USB监控服务/守护进程,以检测特定的PID/VID设备。我可以很容易地通过过滤PID/VID来检测设备'add‘动作,但是当我从端口删除任何USB设备时,作为’删除‘动作的一部分,我尝试过滤PID/VID,就像在'add’动作中一样.通过使用
const char* vendor = udev_device_get_sysattr_value(dev, "idVendor");
const char* product = udev_device_get_sysattr_value(dev, "idProduct");
但是在上面两个字符ptr中,我总是得到NULL。由于这个原因,我的删除操作将执行所有USB设备,这将从端口删除。
他们在libudev API中是否有其他方法来检测特定的设备删除?
发布于 2020-09-26 00:47:08
在我的经验中,一旦USB设备处于“删除”操作,udev_device_get_sysattr_value(dev)
将返回NULL。即使是先前的“解除约束”操作也为时已晚。
检测特定设备删除的一种方法是在插入其dev节点时存储它。
首先,通过枚举设备(struct udev_enumerate*
)(设备已经插入)和监视"add“或"bind”操作来查找要监视的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节点可能都会更改。
https://stackoverflow.com/questions/53976705
复制相似问题