首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Linux中使用libudev编程列出USB海量存储设备?

如何在Linux中使用libudev编程列出USB海量存储设备?
EN

Stack Overflow用户
提问于 2014-08-18 10:21:16
回答 1查看 8.8K关注 0票数 6

我正在做一个在linux中使用大规模存储设备的项目。我正在尝试编写一个应用程序,它将列出所有连接的usb海量存储设备,并在插入新的海量存储设备时发出通知。为此,我正在使用libudev。我使用了"http://www.signal11.us/oss/udev/“中的代码。我在这里做了修改

代码语言:javascript
复制
  /* Create a list of the devices in the 'block' subsystem. */
  enumerate = udev_enumerate_new(udev);
  udev_enumerate_add_match_subsystem(enumerate, "block");
  udev_enumerate_scan_devices(enumerate);
  devices = udev_enumerate_get_list_entry(enumerate);

现在的问题是它列出了所有的块设备。我只想要usb大容量存储设备。的另一个问题是如何使用libudev.获取usb存储设备的标签。

EN

回答 1

Stack Overflow用户

发布于 2015-01-17 14:18:01

一种解决方案是将设备与以下条件匹配:

  • 子系统== "scsi",DEVTYPE == "scsi_device“
  • 子设备存在子系统==“块”
  • 子设备与子系统== "scsi_disk“一起存在
  • 父设备与子系统== "usb“、DEVTYPE == "usb_device”一起存在。

下面是示例程序(也可以使用论github):

代码语言:javascript
复制
#include <libudev.h>
#include <stdio.h>

static struct udev_device*
get_child(
     struct udev* udev, struct udev_device* parent, const char* subsystem)
{
  struct udev_device* child = NULL;
  struct udev_enumerate *enumerate = udev_enumerate_new(udev);

  udev_enumerate_add_match_parent(enumerate, parent);
  udev_enumerate_add_match_subsystem(enumerate, subsystem);
  udev_enumerate_scan_devices(enumerate);

  struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate);
  struct udev_list_entry *entry;

  udev_list_entry_foreach(entry, devices) {
    const char *path = udev_list_entry_get_name(entry);
    child = udev_device_new_from_syspath(udev, path);
    break;
  }

  udev_enumerate_unref(enumerate);
  return child;
}

static void enumerate_usb_mass_storage(struct udev* udev)
{
  struct udev_enumerate* enumerate = udev_enumerate_new(udev);

  udev_enumerate_add_match_subsystem(enumerate, "scsi");
  udev_enumerate_add_match_property(enumerate, "DEVTYPE", "scsi_device");
  udev_enumerate_scan_devices(enumerate);

  struct udev_list_entry *devices = udev_enumerate_get_list_entry(enumerate);
  struct udev_list_entry *entry;

  udev_list_entry_foreach(entry, devices) {
    const char* path = udev_list_entry_get_name(entry);
    struct udev_device* scsi = udev_device_new_from_syspath(udev, path);

    struct udev_device* block = get_child(udev, scsi, "block");
    struct udev_device* scsi_disk = get_child(udev, scsi, "scsi_disk");

    struct udev_device* usb
      = udev_device_get_parent_with_subsystem_devtype(
          scsi, "usb", "usb_device");

    if (block && scsi_disk && usb) {
        printf("block = %s, usb = %s:%s, scsi = %s\n",
          udev_device_get_devnode(block),
          udev_device_get_sysattr_value(usb, "idVendor"),
          udev_device_get_sysattr_value(usb, "idProduct"),
          udev_device_get_sysattr_value(scsi, "vendor"));
    }

    if (block)
      udev_device_unref(block);

    if (scsi_disk)
      udev_device_unref(scsi_disk);

    udev_device_unref(scsi);
  }

  udev_enumerate_unref(enumerate);
}

int main()
{
  struct udev* udev = udev_new();

  enumerate_usb_mass_storage(udev);

  udev_unref(udev);
  return 0;
}

它是输出到我的外部磁盘:

代码语言:javascript
复制
block = /dev/sdb, usb = 0bc2:ab20, scsi = Seagate
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25361042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档