You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不依赖systemd的Linux系统中获取USB设备的ID_MODEL与ID_VENDOR

不依赖systemd获取USB设备ID_MODEL和ID_VENDOR的方案

直接读取Linux内核提供的sysfs文件系统是最可靠的方式,sysfs是所有Linux发行版(包括OpenRC-based的Gentoo、Atrix等)都原生支持的设备信息接口,无需依赖任何init系统或额外库。

实现思路

  1. 从给定的/dev/bus/usb/xxx/yyy路径中提取总线号(xxx)和设备号(yyy)
  2. 构造对应设备的sysfs根路径:/sys/bus/usb/devices/${BUS}:${DEV}.0(默认配置号为0,适用于绝大多数设备)
  3. 读取该路径下的manufacturer文件(对应ID_VENDOR)和product文件(对应ID_MODEL)

C语言实现代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libgen.h>

#define SYSFS_USB_BASE "/sys/bus/usb/devices/"
#define BUFFER_SIZE 256

// 从/dev/bus/usb/xxx/yyy路径提取总线号和设备号
int parse_usb_path(const char *path, char *bus, char *dev) {
    char *copy = strdup(path);
    if (!copy) return -1;

    char *dir = dirname(copy);
    strncpy(bus, basename(dir), BUFFER_SIZE - 1);
    strncpy(dev, basename((char*)path), BUFFER_SIZE - 1);

    free(copy);
    return 0;
}

// 读取sysfs文件内容并去除换行符
int read_sysfs_file(const char *path, char *buffer, size_t buf_size) {
    FILE *fp = fopen(path, "r");
    if (!fp) return -1;

    if (fgets(buffer, buf_size, fp) == NULL) {
        fclose(fp);
        return -1;
    }

    buffer[strcspn(buffer, "\n")] = '\0';
    fclose(fp);
    return 0;
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s /dev/bus/usb/xxx/yyy\n", argv[0]);
        return 1;
    }

    char bus[BUFFER_SIZE], dev[BUFFER_SIZE];
    if (parse_usb_path(argv[1], bus, dev) != 0) {
        fprintf(stderr, "Failed to parse USB device path\n");
        return 1;
    }

    // 构造sysfs设备根路径
    char sysfs_dev_path[BUFFER_SIZE];
    snprintf(sysfs_dev_path, BUFFER_SIZE, "%s%s:%s.0", SYSFS_USB_BASE, bus, dev);

    // 读取厂商名称(ID_VENDOR)和产品名称(ID_MODEL)
    char vendor[BUFFER_SIZE], model[BUFFER_SIZE];
    char vendor_path[BUFFER_SIZE], model_path[BUFFER_SIZE];

    snprintf(vendor_path, BUFFER_SIZE, "%s/manufacturer", sysfs_dev_path);
    snprintf(model_path, BUFFER_SIZE, "%s/product", sysfs_dev_path);

    if (read_sysfs_file(vendor_path, vendor, BUFFER_SIZE) != 0) {
        fprintf(stderr, "Failed to read vendor information\n");
        return 1;
    }

    if (read_sysfs_file(model_path, model, BUFFER_SIZE) != 0) {
        fprintf(stderr, "Failed to read model information\n");
        return 1;
    }

    printf("ID_VENDOR: %s\n", vendor);
    printf("ID_MODEL: %s\n", model);

    return 0;
}

编译与使用

编译命令:

cc usb-info.c -o usb-info

运行示例(替换为你的设备路径):

./usb-info /dev/bus/usb/001/002

扩展说明

  • 如果需要获取十六进制的厂商ID(ID_VENDOR_ID)和产品ID(ID_MODEL_ID),可读取sysfs路径下的idVendor和idProduct文件
  • 对于存在多配置的特殊USB设备,可通过遍历/sys/bus/usb/devices/${BUS}:${DEV}.*路径找到正确的配置目录,或通过realpath获取设备的真实sysfs路径后向上遍历

内容的提问来源于stack exchange,提问作者Rungela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:04:54