如何在不依赖systemd的Linux系统中获取USB设备的ID_MODEL与ID_VENDOR
不依赖systemd获取USB设备ID_MODEL和ID_VENDOR的方案
直接读取Linux内核提供的sysfs文件系统是最可靠的方式,sysfs是所有Linux发行版(包括OpenRC-based的Gentoo、Atrix等)都原生支持的设备信息接口,无需依赖任何init系统或额外库。
实现思路
- 从给定的
/dev/bus/usb/xxx/yyy路径中提取总线号(xxx)和设备号(yyy) - 构造对应设备的sysfs根路径:
/sys/bus/usb/devices/${BUS}:${DEV}.0(默认配置号为0,适用于绝大多数设备) - 读取该路径下的
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
相关产品推荐
相关产品推荐

