udev_enumerate_get_list_entry 返回设备的顺序
时间: 2023-06-20 20:05:33 浏览: 129
udev_enumerate_get_list_entry 函数返回一个指向 udev 设备列表的链表头的指针,链表中的每个节点都代表一个 udev 设备。链表的顺序是根据内核驱动程序的探测顺序生成的,通常是从上到下或从左到右的顺序。因此,可以通过遍历该链表并处理每个设备来按顺序获取 udev 设备。
相关问题
解释一下这段函数的作用void CUsbMonitorDevice::mount_plugged_devices (struct udev *udev) { struct udev_enumerate *udev_enum; struct udev_list_entry *devices; struct udev_list_entry *entry; struct udev_device *dev; const char *path; udev_enum = udev_enumerate_new(udev); udev_enumerate_add_match_subsystem(udev_enum, "block"); udev_enumerate_scan_devices(udev_enum); devices = udev_enumerate_get_list_entry(udev_enum); udev_list_entry_foreach(entry, devices) { path = udev_list_entry_get_name(entry); dev = udev_device_new_from_syspath(udev, path); if (!table_search_by_udev(m_mtab, dev)) { on_udev_add(dev); } udev_device_unref(dev); } udev_enumerate_unref(udev_enum); }
这段函数的作用是在使用 `libudev` 库的情况下,挂载已插入的设备。
函数的逻辑如下:
1. 创建一个 `udev_enumerate` 结构体对象 `udev_enum`,用于枚举设备。
2. 添加一个匹配子系统为 "block" 的过滤条件,只枚举块设备。
3. 扫描设备并将结果保存在 `devices` 中。
4. 遍历设备列表 `devices`。
5. 获取当前设备的路径 `path`。
6. 根据设备路径创建一个 `udev_device` 对象 `dev`。
7. 如果当前设备不在已挂载设备表 `m_mtab` 中,则调用 `on_udev_add()` 函数进行挂载处理。
8. 释放设备对象 `dev`。
9. 释放设备枚举对象 `udev_enum`。
总体而言,这段函数的作用是通过 `libudev` 库枚举已插入的块设备,并将未挂载的设备进行挂载处理。
写出编译命令:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <libudev.h> int main() { struct udev *udev = udev_new(); if (!udev) { fprintf(stderr, "无法初始化udev\n"); return 1; } struct udev_enumerate *enumerate = udev_enumerate_new(udev); udev_enumerate_add_match_subsystem(enumerate, "video4linux"); 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 *device = udev_device_new_from_syspath(udev, path); const char *vid = udev_device_get_sysattr_value(device, "idVendor"); const char *pid = udev_device_get_sysattr_value(device, "idProduct"); printf("VID: %s\n", vid); printf("PID: %s\n", pid); udev_device_unref(device); } udev_enumerate_unref(enumerate); udev_unref(udev); return 0; }
你可以使用以下命令来编译上述代码:
gcc -o get_usb_pid_vid get_usb_pid_vid.c -ludev
这个命令将会将源代码文件 `get_usb_pid_vid.c` 编译成可执行文件 `get_usb_pid_vid`,并链接 libudev 库。请确保你已经安装了 libudev 库和相应的开发包,否则编译可能会失败。
阅读全文