在Linux系统中,libudev是一个用于访问和控制用户空间与内核设备管理器的接口库,它提供了一种简单的方式来获取设备的详细信息,包括USB设备的VID(厂商ID)和PID(产品ID),本文将介绍如何使用libudev获取USB设备的VID和PID。
安装libudev
在使用libudev之前,首先需要安装它,在基于Debian的系统(如Ubuntu)中,可以使用以下命令安装:
sudo aptget install libudevdev
在基于RPM的系统(如CentOS、Fedora)中,可以使用以下命令安装:
sudo yum install libudevdevel
编写程序获取USB设备VID和PID
1、包含头文件
在程序中,需要包含libudev库的头文件,以便使用其提供的函数和数据结构,通常,我们会包含以下头文件:
#include <libudev.h>
2、打开设备管理器
要使用libudev,首先需要打开设备管理器,可以使用udev_new()
函数创建一个新的udev对象,然后使用udev_open()
函数打开设备管理器。
struct udev *udev = udev_new(); if (!udev) { perror("无法创建udev对象"); exit(1); } if (udev_open(udev) < 0) { perror("无法打开设备管理器"); udev_unref(udev); exit(1); }
3、遍历设备列表
使用udev_enumerate_devices()
函数可以遍历系统中的所有设备,该函数返回一个指向设备列表的指针,每个设备都是一个struct udev_device
结构体。
struct udev_list_entry *devices = udev_enumerate_devices(udev); const struct udev_device *device; struct udev_device *parent_device = NULL; int vid, pid; const char *path;
4、获取设备信息
对于每个设备,可以使用udev_device_get_action()
函数获取其操作类型,使用udev_device_get_parent_with_subsystem_devtype()
函数获取其父设备,使用udev_device_get_property_value()
函数获取设备的属性值。
while ((device = udev_list_entry(devices, struct udev_device, subsystems)) != NULL) { const char *action = udev_device_get_action(device); if (strcmp(action, "add") == 0) { // 只处理新添加的设备 const char *subsystem = udev_device_get_subsystem(device); if (strcmp(subsystem, "usb") == 0) { // 只处理USB设备 parent_device = udev_device_get_parent_with_subsystem_devtype(device, "usb", "usb_device"); // 获取父设备(USB设备) path = udev_device_get_syspath(parent_device); // 获取设备的路径(sysfs中的节点) vid = udev_device_get_property_int(parent_device, "idVendor"); // 获取VID(厂商ID) pid = udev_device_get_property_int(parent_device, "idProduct"); // 获取PID(产品ID) printf("VID: %d, PID: %d, Path: %s ", vid, pid, path); // 输出VID、PID和路径 } else { printf("非USB设备,跳过 "); } } else { printf("非新添加设备,跳过 "); } udev_list_entry_free(device); // 释放设备列表项内存 }
5、关闭设备管理器并释放资源
遍历完设备列表后,需要关闭设备管理器并释放资源。
udev_close(udev); // 关闭设备管理器 udev_unref(udev); // 释放udev对象内存
编译运行程序
将上述代码保存为usbvidpid.c
,然后使用以下命令编译:
gcc o usbvidpid usbvidpid.c ludev lusb1.0 lutil lrt lpthread ldl lm Wall Wextra Werror O2 g3 DDEBUG=1 DLOGGING=1 DLOGLEVEL=3 DLOGFILE="/var/log/usbvidpid.log" I/usr/include/libudev1.0 I/usr/include/usb1.0 I/usr/include/util I/usr/include/rtl I/usr/include/libdl I/usr/include/lm I/usr/include/linux/types.h I/usr/include/linux/compiler.h I/usr/include/linux/module.h I/usr/include/linux/kbuild I/usr/include/asmgeneric /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local/include /usr/local//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1.0//ust1
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/509213.html