【问题标题】:libudev udev_device_get_sysattr_value() return NULL for idVendor/idProduct when device is removed移除设备时,libudev udev_device_get_sysattr_value() 为 idVendor/idProduct 返回 NULL
【发布时间】:2020-09-26 08:47:08
【问题描述】:

我正在尝试实施 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 中是否有任何其他方式仅检测特定设备删除?

【问题讨论】:

  • 我在 libudev/systemd 代码中搜索后得到了答案,这个 API 名为 ... const char *udev_device_get_property_value() 以“product”为关键解决了我的问题
  • 但是使用最新的内核版本(UBUNTU 18.04,CentOS 7.6 和内核版本 5.0)为 *udev_device_get_property_value() 方法返回 null。你的 Linux 系统和内核版本是什么?

标签: linux usb udev


【解决方案1】:

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

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

首先,通过枚举设备(struct udev_enumerate*)(设备已插入)并监控“添加”或“绑定”操作,找到您要监控的udev_device*。 在这些状态下,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 节点匹配,以识别该操作适用于您正在监控的设备。

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

【讨论】:

    猜你喜欢
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    相关资源
    最近更新 更多